使用ajax上传文件 - 来自PHP的echo告诉文件已上传,但文件不存在

时间:2014-03-06 19:14:14

标签: php ajax file-upload xmlhttprequest

您好我正在尝试使用这段代码:

我正在尝试构建智能图像上传器,它将关心html 5多选错误(或某人可以说的功能),当我决定选择一些额外的时候会删除“以前的文件”。它还有一些原始方法允许用户选择之前选择的文件。

这部分工作正常,我看到图像预览,并且还在控制台中回显“文件”对应于文件数。

奇怪的是来自PHP脚本的返回(echo),它说文件在/ tmp目录中,并且大小正确,但文件不会被移动。

我检查了权限并将上传的文件夹设置为“lucky”777。 我检查/ tmp文件夹和文件是没有,但PHP脚本说taht在这里。 我知道你不能设置,这是合乎逻辑的为什么你不能,但是应该从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>

2 个答案:

答案 0 :(得分:0)

它实际上可能是语法问题。你在move_uploaded_file调用中混合了字符串和变量。试试这个:

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

答案 1 :(得分: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);
?>