Plupload块大小重命名文件为Blob

Posted

技术标签:

【中文标题】Plupload块大小重命名文件为Blob【英文标题】:Plupload chunk size renaming file to 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 而不是实际名称。

【问题讨论】:

如何找回它? 【参考方案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

【讨论】:

以上是关于Plupload块大小重命名文件为Blob的主要内容,如果未能解决你的问题,请参考以下文章

使用 AspNet 从 Azure Blob 存储下载和重命名文件

Gradle - 复制/重命名文件 - 为所有文件制作 0 文件大小/字节

Azure 存储 Blob 重命名

当git上只做文件大小写重命名的修改时,如何躲坑

linux下怎么样重命名文件

sh 重命名文件夹大小写更改