【问题标题】:Plupload chunk size renaming file to BlobPlupload块大小重命名文件为Blob
【发布时间】:2014-12-23 23:52:49
【问题描述】:

我正在使用 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”作为名称,而不是 Test。

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

感谢您的帮助。

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

[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 而不是实际名称。

【问题讨论】:

  • 如何找回它?

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


【解决方案1】:

GitHub 详细描述了此问题。这可能有点令人困惑,但据我了解:

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

【讨论】:

  • 这是正确的,几个月前我不得不解决同样的问题。
【解决方案2】:

用 nus 来扩展答案:

我在 Javascript 中使用了BeforeUpload 事件,如GitHub post 中所述,然后不得不在服务器端进行更改。

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

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

但是,这是返回“blob”的地方。相反,我进行了更改,所以虽然我仍然使用Request.Files[f] 作为文件详细信息,但我导出了文件名,如下所示:

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

【讨论】:

    【解决方案3】:

    在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

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 2011-12-24
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多