Jquery File Upload 总是失败,File Upload Aborted

Posted

技术标签:

【中文标题】Jquery File Upload 总是失败,File Upload Aborted【英文标题】:Jquery File Upload always fails with File Upload Aborted 【发布时间】:2014-05-28 16:23:24 【问题描述】:

我正在尝试让Blueimp's Jquery File Upload 插件在我的网站上运行,但我终生无法让它上​​传文件。我整天都在做这件事并且被卡住了。它将上传文件并将其提交给 UploadHandler 类,但是当它试图完成 handle_file_upload 函数时,它会到达:

file_put_contents(
    $file_path,
    fopen('php://input', 'r'),
    $append_file ? FILE_APPEND : 0
);

但总是返回 0。我不知道为什么文件不会上传。我得到的完整回复是:

"files":[
    "name":"1397489968-32",
    "size":0,
    "type":"multipart\/form-data; boundary=----WebKitFormBoundaryrmi4L2ouOmB4UTVm",
    "error":"File upload aborted",
    "deleteUrl":"http:\/\/onceridden.demomycms.co.uk\/eshop\/library\/ajax\/?file=1397489968-32",
    "deleteType":"DELETE"
]

ajax.file-upload.php 只实例化 UploadHandler,没有别的。

如果您想查看 UploadHandler 的完整代码,您可以从 github 下载它,它太大了,我无法在此处发布。

谁能告诉我为什么文件不能上传?是的,我已经完成了基本操作,例如检查文件夹是 CHMOD 777。我已经尝试过使用不同类型的各种文件(它们必须是图像才能工作,仅限于 jpg、png 或 gif)和大小;都产生相同的结果。

根据要求,这是 JS 文件:

$(function () 
    'use strict';
    // Change this to the location of your server-side upload handler:
    var url = '/eshop/library/ajax/ajax.file-upload.php',
        uploadButton = $('<button/>')
            .addClass('btn btn-primary')
            .prop('disabled', true)
            .text('Processing...')
            .on('click', function () 
                var $this = $(this),
                    data = $this.data();
                $this
                    .off('click')
                    .text('Abort')
                    .on('click', function () 
                        $this.remove();
                        data.abort();
                    );
                data.submit().always(function () 
                    $this.remove();
                );
            );
    $('#register-photo').fileupload(
        url: url,
        dataType: 'json',
        autoUpload: false,
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        maxFileSize: 5000000, // 5 MB
        // Enable image resizing, except for android and Opera,
        // which actually support image resizing, but fail to
        // send Blob objects via XHR requests:
        disableImageResize: /Android(?!.*Chrome)|Opera/
            .test(window.navigator.userAgent),
        previewMaxWidth: 100,
        previewMaxHeight: 100,
        previewCrop: true
    ).on('fileuploadadd', function (e, data) 
        data.context = $('<div/>').appendTo('#register-files');
        $.each(data.files, function (index, file) 
            var node = $('<p/>')
                    .append($('<span/>').text(file.name));
            if (!index) 
                node
                    .append('<br>')
                    .append(uploadButton.clone(true).data(data));
            
            node.appendTo(data.context);
        );
    ).on('fileuploadprocessalways', function (e, data) 
        var index = data.index,
            file = data.files[index],
            node = $(data.context.children()[index]);
        if (file.preview) 
            node
                .prepend('<br>')
                .prepend(file.preview);
        
        if (file.error) 
            node
                .append('<br>')
                .append($('<span class="text-danger"/>').text(file.error));
        
        if (index + 1 === data.files.length) 
            data.context.find('button')
                .text('Upload')
                .prop('disabled', !!data.files.error);
        
    ).on('fileuploadprogressall', function (e, data) 
        var progress = parseInt(data.loaded / data.total * 100, 10);
        $('#register-progress .progress-bar').css(
            'width',
            progress + '%'
        );
    ).on('fileuploaddone', function (e, data) 
        $.each(data.result.files, function (index, file) 
            if (file.url) 
                var link = $('<a>')
                    .attr('target', '_blank')
                    .prop('href', file.url);
                $(data.context.children()[index])
                    .wrap(link);
             else if (file.error) 
                var error = $('<span class="text-danger"/>').text(file.error);
                $(data.context.children()[index])
                    .append('<br>')
                    .append(error);
            
        );
    ).on('fileuploadfail', function (e, data) 
        $.each(data.files, function (index, file) 
            var error = $('<span class="text-danger"/>').text('File upload failed.');
            $(data.context.children()[index])
                .append('<br>')
                .append(error);
        );
    ).prop('disabled', !$.support.fileInput)
        .parent().addClass($.support.fileInput ? undefined : 'disabled');
);

这几乎是您使用插件获得的默认文件,只是更改了 ID 以匹配我的表单。


更新

经过多次尝试和测试,我发现当您将输入的名称从 files 更改为其他名称时会出现问题。为什么我不知道。如果您想让它在页面上的多个输入上运行,这显然是一个问题......

我自己创建了一个非常简单的界面版本,并且确实允许我更改文件名,所以它必须与他们使用的示例有关。我希望能够使用预览图像等(在我的简单测试中我无法弄清楚)所以我需要解决这个问题。

【问题讨论】:

所以它实际上是在上传文件,但问题是在服务器端代码上传之后?您是否尝试过各种大小和类型的文件并获得相同的结果? @Sparky 是的,我可以看到正在调用 ajax.file-upload.php 和响应,所以我知道正在调用服务器端代码。我已经尝试过使用不同大小和类型的多个文件,所有文件都产生相同的结果。 向我们展示您的插件options 和相关的 html 标记。 @Sparky 我已经编辑了我的问题以显示 JS 文件。 您使用的是哪个server-side integration? 【参考方案1】:

这是为了以防其他人也遇到这个问题。该问题是由paramName 选项引起的,如果未设置该选项,则从输入名称中获取其值。默认情况下未设置,因此在更改输入名称时我也在更改 paramName,这意味着它不再匹配从 UploadHandler 类返回的变量。

解决方案是添加paramName: 'files[]' 作为选项。

【讨论】:

'upload_url' => $this->get_full_url().'/files/' 和 'param_name' => 'files',如果我将其更改为 files[],则会出现错误“空文件上传结果”。有什么想法吗?? 您应该开始一个新问题以获得帮助。 我得到的答案是文件名更改出错。【参考方案2】:

我遇到了同样的问题(操作中止)并且有不同的答案。

我上传文件的文件夹/目录没有上传文件的权限。 在 Linux 服务器上,您可以运行以下命令 chmod 777 文件 当我授予这个目录的权限时,我没有收到这个错误,并且可以成功上传文件。

【讨论】:

只是对此有所贡献,演示的默认上传位置是uploadDirectory/server/php/files/(只是为了将人们从chmod 777'ing整个目录中拯救出来)【参考方案3】:

我运行的是 centOS 6.9。 chmod 0755 /server/php/files (而不是 777),我将所有权(chown)更改为 apache。哒哒!

【讨论】:

以上是关于Jquery File Upload 总是失败,File Upload Aborted的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 CORS POST 因 JQuery-file-upload 失败

jquery fileupload plugin

批量上传图片(jQuery-File-Upload使用)

如何将项目 Expressjs 与 jQuery-File-Upload 集成?

jQuery-File-Upload 无文件

jQuery-File-upload:删除时出现 405 错误“方法不允许”