Plupload chunk size将文件重命名为Blob

时间:2014-10-28 14:18:06

标签: javascript c# model-view-controller plupload

我使用Plupload下载文件。我们的配置如下:

$("#uploadData").pluploadQueue({
        // General settings
        runtimes: 'html5,flash,silverlight,html4',
        url: serviceurl,

        // Maximum file size
        max_file_size: '50mb',

        chunk_size: '1mb',

        max_file_count: 50,

        unique_names: true,

        // Resize images on clientside if we can
        resize: {
            width: 200,
            height: 200,
            quality: 90,
            crop: true // crop to exact dimensions
        },

        // Specify what files to browse for
        filters: [
            { title: "Documents Excel", extensions: "xlsx" }
        ],

        init: {

            FilesAdded: function (up, files) {
                up.start();
            },

            UploadComplete: function (up, files) {
                if (up.total.uploaded == up.files.length) {
                    $(".plupload_buttons").css("display", "inline");
                    $(".plupload_upload_status").css("display", "inline");
                    up.init();
                }
            }
        },

我遇到的问题是当我上传一个大于1MB的文件时,我没有收到正确的名称,而是收到了Blob的名字。 例如,我的文件名是" Test.xlsx"并且大小为2MB,我将在服务器端接收" blob"名称而不是测试。

限制,我不允许更改客户端的卡盘尺寸限制。 我怎样才能得到正确的名字。

感谢您的帮助。

用于在服务器端接收数据的代码:

[System.Web.Mvc.HttpPost]
        public ActionResult UploadData(int? chunk, string name)
        {
            var fileUpload = Request.Files[0];

            if (Session["upDataFiles"] == null)
            {
                Session["upDataFiles"] = new List<FileUploadViewModel>();
            }

            Session["upDataFiles"] = UpdateTempDataUpload(fileUpload.FileName, name, (List<FileUploadViewModel>)Session["upDataFiles"]);

            UploadFile(chunk, name);
            return Content("chunk uploaded", "text/plain");
        }

private void UploadFile(int? fileChunk, string fileName)
        {
            var fileUpload = Request.Files[0];
            var uploadPath = Server.MapPath("~/App_Data");
            var fullPath = Path.Combine(uploadPath, fileName);
            fileChunk = fileChunk ?? 0;
            using (var fs = new FileStream(Path.Combine(uploadPath, fileName), fileChunk == 0 ? FileMode.Create : FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
            {
                var buffer = new byte[fileUpload.InputStream.Length];
                fileUpload.InputStream.Read(buffer, 0, buffer.Length);
                fs.Write(buffer, 0, buffer.Length);
                fs.Close();
            }
        }

当我检查request.File对象中的名称时,它是blob而不是实际名称。

3 个答案:

答案 0 :(得分:3)

GitHub详细介绍了此问题。这可能有点令人困惑,但据我所知:

  • $ _ FILES [&#39; name&#39; ]将强制性地成为&#39; blob&#39;如果你使用块。
  • 他们似乎声称$ _REQUEST [&#39; name&#39; ]应该有真实姓名,但用户似乎不同意。
  • 作为一种解决方法,建议在另一个表单字段或url参数中发送文件名(使用例如BeforeUpload事件来设置该信息)。您可以设置multipart_params并将信息存储在之前添加的文件对象中,或者查看html中的字段以获取此处的信息。

答案 1 :(得分:0)

通过nus扩展答案:

我在GitHub post中使用Javascript中的BeforeUpload事件,然后必须在服务器端进行更改。

以前,要获取我使用的文件名:

var file = Request.Files[f];
var fileName = file.FileName 

然而,这是“blob'返回的地方。相反,我做了一个更改,所以当我仍然使用Request.Files[f]作为文件详细信息时,我得到了文件名,如下所示:

var file = Request.Files[f];
var fileName = Request.Params["name"];

答案 2 :(得分:0)

在init下使用BeforeUpload事件,如下所示:

init : {
    BeforeUpload: function(up, file) {
        log('[BeforeUpload]', 'File: ', file);
    }
}

还添加日志功能:

function log() {
var str = "";

plupload.each(arguments, function(arg) {
    var row = "";

    if (typeof(arg) != "string") {
        plupload.each(arg, function(value, key) {
            // Convert items in File objects to human readable form
            if (arg instanceof plupload.File) {
                // Convert status to human readable
                switch (value) {
                    case plupload.QUEUED:
                        value = 'QUEUED';
                        break;

                    case plupload.UPLOADING:
                        value = 'UPLOADING';
                        break;

                    case plupload.FAILED:
                        value = 'FAILED';
                        break;

                    case plupload.DONE:
                        value = 'DONE';
                        break;
                }
            }

            if (typeof(value) != "function") {
                row += (row ? ', ' : '') + key + '=' + value;
            }
        });

        str += row + " ";
    } else {
        str += arg + " ";
    }
});

var log = $('#log');
log.append(str + "\n");
// log.scrollTop(log[0].scrollHeight);
}

然后您可以在$_POST['name']$_REQUEST['name']中获取文件名。 您也可以将unique_names设置为false。 您还可以找到帮助here