【问题标题】:uploading file using ajax - echo from PHP tells that file is uploaded, but file is not there使用 ajax 上传文件 - 来自 PHP 的回显告诉文件已上传,但文件不存在
【发布时间】:2014-04-09 15:21:45
【问题描述】:

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

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

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

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

我检查了权限并将上传的文件夹设置为“幸运”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>

【问题讨论】:

  • 我建议在 move_uploaded_file 的第二个参数中使用绝对路径。例如,尝试move_uploaded_file($_FILES["upload"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"]."/upload/".$_FILES["file"]["name"]);
  • 不幸的是,这没有帮助......
  • 确保运行 Web 服务器的用户有权写入 upload/ 目录。

标签: php jquery ajax file-upload xmlhttprequest


【解决方案1】:

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

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

【讨论】:

  • 本地主机还是互联网服务器?您可能需要检查 php.ini 中是否存在拒绝访问 PHP 以移动文件的设置。我想我还是错了 - 现在我认为它仍然会执行 move_uploaded_file 命令,只是将返回的结果回显到页面。
  • localhost ...但我认为上传是可能的,因为在其他具有简单上传表单的网站上上传文件就可以了
【解决方案2】:

我重新考虑了这种方法。使用 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);
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2012-04-22
    • 2014-03-22
    • 2012-06-05
    • 2016-09-04
    • 2013-08-23
    相关资源
    最近更新 更多