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 存储下载和重命名文件