【问题标题】:Ajax PHP file upload mistakeAjax PHP文件上传错误
【发布时间】:2015-06-15 23:41:06
【问题描述】:

我在客户端有这段代码:

fileUpload: function monkey(){
        var file = t.gI("photoFile"); //get element by photoFile
        var formData = new FormData();
        console.log(file.files.length);
        formData.append("upload", file.files[0]);
        var req = t.gR(); //XMLHTTPRequest
        req.open('POST', 'php/fileupload.php', true);
        req.setRequestHeader("Content-Type", "multipart/form-data", true);
        req.send(formData);
        req.onreadystatechange = function () {
            if (req.readyState === 4) {
                if (req.status == 200 && req.status < 300) {
                    t.gI("eventBox").innerHTML = req.responseText; //eventbox error handler
                    adminHandler.eventBox();
                }
            }
        }
    },

这在服务器端:

<?php
    header('Content-Type:multipart/form-data');

    echo $_FILES['upload']['tmp_name'];
?>

我收到了这个错误消息:

[15-Jun-2015 12:03:21 UTC] PHP 警告:multipart/form-data POST 数据在第 0 行的未知中缺少边界 [15-Jun-2015 12:03:21 UTC] PHP 注意:未定义索引:在 /home/webprogb/public_html/php/fileupload.php 第 4 行上传

我能做些什么来解决它?

【问题讨论】:

  • 您不会从服务器输出 multipart/form-data。那是为客户端发送正常的非文件上传表单服务器。你的服务器端脚本应该只是&lt;?php echo 'foo' ?&gt;。如果您所做的只是转储文件名,则无需标题。并且未定义的索引意味着没有文件被上传。 var_dump($_FILES) 可能会显示它是空的。

标签: php ajax multipartform-data


【解决方案1】:

您可以使用此代码在纯 javascript 中使用 ajax 上传文件。根据文件字段ID更改此“#fileUploader”。

var AjaxFileUploader = function () {
    this._file = null;
    var self = this;

    this.uploadFile = function (uploadUrl, file) {
        var xhr = new XMLHttpRequest();
        xhr.onprogress = function (e) {
           //error
        };

        xhr.onload = function (e) {
            //error
        };

        xhr.onerror = function (e) {
            //error
        };

        xhr.open("post", uploadUrl, true);

        xhr.setRequestHeader("Content-Type", "multipart/form-data");
        xhr.setRequestHeader("X-File-Name", file.name);
        xhr.setRequestHeader("X-File-Size", file.size);
        xhr.setRequestHeader("X-File-Type", file.type);

        xhr.send(file);
    };
};

AjaxFileUploader.IsAsyncFileUploadSupported = function () {
    return typeof (new XMLHttpRequest().upload) !== 'undefined';
}

 if (AjaxFileUploader.IsAsyncFileUploadSupported) {
        ajaxFileUploader = new AjaxFileUploader();

        $("form").submit(function () {
            var uploader = $("#fileUploader")[0];

            if (uploader.files.length == 0) {
                return;
            } else {
                ajaxFileUploader.uploadFile(
                    "/YourUploadUrl",
                    uploader.files[0]);
            }

            return false;
        });
    }

【讨论】:

  • 不用jquery可以吗?
  • @PumpkinSeed 我已经更新了答案:) 请检查
  • 谢谢,我会尽快尝试。
  • 对我不起作用我正在尝试使用凭据上传到远程主机,因此我还在服务器端设置了来源。我得到了XMLHttpRequest cannot load http://localhost:8000/test. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4000' is therefore not allowed access. 但是当我使用$.ajax 时它起作用了
猜你喜欢
  • 2013-12-04
  • 1970-01-01
  • 2017-10-22
  • 2012-06-18
  • 2010-09-05
  • 2012-05-04
  • 2012-04-22
相关资源
最近更新 更多