2014-03-06 51 views
0

你好我試圖去上班這段代碼:上傳文件中使用AJAX - 回波PHP告知文件被上傳,但是文件不存在

我試圖構建智能圖像上傳,這將關心html5多選題(或某人可以說的功能),當我決定選擇一些額外的時候,它將刪除「以前的文件」。它也有一些原始的方法來允許用戶選擇以前選擇的文件。

這部分工作正常,我看到圖像預覽,並且在控制檯中回顯「文件」對應於文件數量。

奇怪的是來自PHP腳本的返回(回聲),它表示該文件位於/ tmp目錄中,並且大小也是正確的,但文件不會被移動。

我檢查了權限,並將上傳的文件夾設置爲「幸運」777. 我檢查了/ tmp文件夾和文件是否存在,但PHP腳本說是在這裏。 我知道你不能設置,這是合乎邏輯的爲什麼你不能,但應該從PHP腳本回顯顯示這個文件的大小和tmp位置,那麼如果這是一個問題?

代碼在這裏:

var noveSub = []; 
var noveSubMeno = []; 
var noveSubVelkost = []; 

function samotnyUpload() { 
    var fd = new FormData();  
    fd.append('upload', noveSub[0]); 
// trying just first file for testing 

    $.ajax({ 
     url: '/upload/upload.php', 
     data: fd, 
     cache: false, 
     processData: false, 
     contentType: false, 
     type: 'POST', 
     success: function(data){ 
      console.log(data); 
     } 
    }); 
} 

function pridatSubory() { 
$("li.pridaj").click(function() { 
    $("input").trigger("click"); 
}); 

function pushniNovy(subor) { 
    noveSub.push(subor); 
    noveSubMeno.push(subor.name); 
    noveSubVelkost.push(subor.size); 
    previewNovy(subor); 
} 

function previewNovy(subor) { 
    var li = document.createElement("li"); 
    var img = document.createElement("img"); 
    img.file = subor; 
    li.appendChild(img); 
    $(li).insertBefore("li.pridaj");  
    var reader = new FileReader(); 
    reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img); 
    reader.readAsDataURL(subor); 
} 

var inputElement = document.getElementById("vyberSubor"); 
inputElement.addEventListener("change", handleFiles, false); 
function handleFiles() { 
    var sub = this.files; 
    for (i=0; i<sub.length; i++) { 
     pos = noveSubMeno.indexOf(sub[i].name); 
     if (pos !== -1) { 
      if (noveSubVelkost[pos] !== sub[i].size) { 
       pushniNovy(sub[i]); 
      } 
     } else { 
      pushniNovy(sub[i]); 
     } 
    } 
} 

php文件:

<?php 
if ($_FILES["upload"]["error"] > 0) 
    { 
    echo "Error: " . $_FILES["upload"]["error"] . "<br>"; 
    } 
else 
    { 
    echo "Upload: " . $_FILES["upload"]["name"] . "<br>"; 
    echo "Type: " . $_FILES["upload"]["type"] . "<br>"; 
    echo "Size: " . ($_FILES["upload"]["size"]/1024) . " kB<br>"; 
    echo "Stored in: " . $_FILES["upload"]["tmp_name"]; 
    echo "<br><br>"; 
    echo move_uploaded_file($_FILES["upload"]["tmp_name"], "upload/".$_FILES["file"]["name"]); 
    } 
?> 

輸出PHP文件中控制檯:

Upload: erb128.png<br>Type: image/png<br>Size: 4.734375 kB<br>Stored in: /tmp/phpdTy053<br><br> 
+0

我建議你move_uploaded_file的第二個參數使用絕對路徑。例如,嘗試'move_uploaded_file($ _ FILES [「upload」] [「tmp_name」],$ _SERVER [「DOCUMENT_ROOT」]。「/ upload /".$_ FILES [」file「] [」name「]);' –

+0

不幸的是,這並沒有幫助... – Kovo

+0

確保用戶Web服務器運行時有權寫入上傳/目錄。 – dcarrith

回答

0

它實際上可能是語法問題。你在move_uploaded_file調用中混合了字符串和變量。試試這個:

$destination = "upload/".$_FILES["file"]["name"]; 
$result = move_uploaded_file($_FILES["upload"]["tmp_name"], $destination); 
echo $result; 
+0

不幸的是,這也沒有影響... – Kovo

+0

本地主機或互聯網服務器?您可能需要檢查php.ini中是否存在會拒絕訪問PHP來移動文件的設置。無論如何,我認爲我錯了 - 現在我認爲它仍然會執行move_uploaded_file命令,只是將返回的結果回顯給頁面。 – larsAnders

+0

本地主機...但我認爲上傳是可能的,因爲在其他網站上簡單的上傳表單文件正在加載就好了 – Kovo

0

我重新考慮這種方法。使用PUT進行上傳。我看過一些好處是:

  • 小內存佔用,即使你上傳非常大的文件
  • ,也看到了能夠暫停上傳腳本。

更改代碼(僅草稿):

var xhr = new XMLHttpRequest(); 
    function samotnyUpload() { 
     xhr.open("put", "http://pingpong.local/upload/upload.php", true); 
     xhr.setRequestHeader("X-File-Name", noveSubMeno[0]); 
     xhr.setRequestHeader("X-File-Size", noveSubVelkost[0]); 
     xhr.send(noveSub[0]); 

     xhr.onreadystatechange = function() { 
       if (xhr.readyState == 4 && xhr.status == 200) { 
        console.log(xhr.responseText); 
       } 
     }; 
    } 

和PHP腳本:

<?php 
$filename = $_SERVER['HTTP_X_FILE_NAME']; 
echo $filename; 
$filesize = $_SERVER['HTTP_X_FILE_SIZE']; 
echo $filesize; 
$in = fopen('php://input','r'); 
$tmp = fopen('tempfile.ext','w'); 
while($data = fread($in, 1024)) fwrite($tmp, $data); 
fclose($in); 
fclose($tmp); 
?>