2016-03-03 2 views
1

У меня есть файл php на моем сервере для загрузки файла. Я попытался загрузить этот файл напрямую, и это было успешным.Не удается загрузить с помощью PhantomJS

Затем я написал простой скрипт phantomjs, запустил его на ubuntu с phantomjs версии 2.1.1, но это не успех. Ошибка не отображалась, но файл не загружался.

Ниже PHP файл:

<?php 
if(isset($_FILES["files"])) 
{ 
    $files = $_FILES["files"]; 
    if($files["name"] != '') 
    { 

      $fullpath = "./".$files["name"]; 
      if(move_uploaded_file($files['tmp_name'],$fullpath)) 
      {      
        echo "<h1><a href='$fullpath'>OK-Click here!</a></h1>";   
      } 
    } 
    echo '<html><head><title>Upload files...</title></head><body><form method=POST enctype="multipart/form-data" action=""><input type="file" name="files"><input type="submit" value="Upload"></form></body></html>'; 
return; 
} 
?> 

И простой phantomjs скрипт для загрузки файла

var webPage = require('webpage'); 
var page = webPage.create(); 
var testindex = 0, loadInProgress = false; 


page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log("load started"); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 
    console.log("load finished"); 
}; 

function load() 
{ 
    page.open("http://myserver.com/upload.php?cmd=upload") 
} 

function upload() 
{ 
    page.uploadFile('input[name=files]', '/home/user/Desktop/log_no_debug.png');  
    page.render("result.png") 
} 



var steps = [ 
    load, 
    upload 
] 

interval = setInterval(function() { 
    if (!loadInProgress && typeof steps[testindex] == "function") { 
    //console.log("step " + (testindex + 1)); 
    steps[testindex](); 
    testindex++; 
    } 
    if (typeof steps[testindex] != "function") { 
    //console.log("test complete!"); 
    phantom.exit(); 
    } 
}, 50);  

Ниже result.png вынесено из upload.js сценария

result render

ответ

5

Файл причина не загружен, потому что вы только выбираете его на стороне клиента, но не отправлять на server - вы не отправляете форму в свой скрипт PhantomJS.

Я изменил сценарий немного, обратите внимание на комментарий:

var webPage = require('webpage'); 
var page = webPage.create(); 
var testindex = 0, loadInProgress = false; 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log("load started"); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 
    console.log("load finished"); 
}; 

function load() 
{ 
    page.open("http://test/upload.php?cmd=upload") 
} 

function upload() 
{ 
    loadInProgress = true; 
    page.uploadFile('input[name=files]', '/path/to/file.ext');  

    // Here we submit the form to the server 
    page.evaluate(function(){ 
     // document.querySelectorAll("input[type=submit]")[0].click(); 
     document.querySelectorAll("form")[0].submit(); 
    }); 
} 

// And only after the page has reloaded it is time to make a screenshot 
function finish() 
{ 
    page.render("result.png"); 
} 

var steps = [ 
    load, 
    upload, 
    finish 
] 

interval = setInterval(function() { 
    if (!loadInProgress && typeof steps[testindex] == "function") { 
    //console.log("step " + (testindex + 1)); 
    steps[testindex](); 
    testindex++; 
    } 
    if (typeof steps[testindex] != "function") { 
    //console.log("test complete!"); 
    phantom.exit(); 
    } 
}, 500);  
+0

ohh теперь это 'ы хороший улов :) – fsn

+0

О, это сработало. Я работал в качестве учебников в Интернете, но никогда не знал, что нам нужно отправить форму. Спасибо за вашу помощь – Rain

0

Прежде всего тщательно подумайте, где и почему вы используете @ be имя переменной fore.

$files = @$_FILES["files"]; 

Небольшой фрагмент из: http://www.php.net/manual/en/language.operators.errorcontrol.php

Предупреждение В настоящее время «@» ошибок управления префикс оператора будет даже отключить отчеты об ошибках для критических ошибок, которые оканчиваются выполнение скрипта. Между прочим, это означает, что если вы используете «@» для подавления ошибок от определенной функции, и либо она недоступна, либо была опечатана, скрипт будет умирать прямо там без указания относительно причины.

Пожалуйста, загрузите ваши $ _FILES [ «файлы»] и проверить, если файлы данных/ы есть, если ответ да, то сбросить ваш $ FULLPATH, и быть уверенным, что это `ы исправить ,

Вы можете попытаться исправить эту строку:

<form method=POST enctype="multipart/form-data" action=""><input type=submit value="Upload"> 

к

<form method="POST" enctype="multipart/form-data" action=""><input type="submit" value="Upload"> 
+0

Спасибо за ваш ответ, но проблема в том, что я могу загрузить файл, просматривая этот файл PHP напрямую. Но это не успешно, когда я использую phantomjs – Rain

+0

Ой, я вижу, тем не менее вы уверены, что $ _Files ["files"] получает правильные файлы? Я имею в виду остальную часть швов кода. – fsn

+0

Да, он получает нужный файл, поскольку я пытался загрузить много раз, и он всегда в порядке. – Rain

Смежные вопросы