将块大小的文件重命名为Blob
本文关键字:重命名 命名为 Blob 文件 | 更新日期: 2023-09-27 18:28:03
我使用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();
}
}
当我检查请求中的名称时。文件对象,它是blob而不是实际名称。
这个问题在GitHub上有详细描述。这可能有点令人困惑,但据我所知:
- 如果使用chunk,$_FILES["name"]将强制为"blob"
- 他们似乎声称$_REQUEST["name"]应该有真名,但用户似乎不同意
- 作为一种变通方法,建议在另一个表单字段或url参数中发送文件名(例如使用
BeforeUpload
事件来设置该信息)。您可以设置multipart_params
并将信息存储在之前添加的文件对象上,或者查看html中的字段以获取此时的信息
将答案扩展一点:
我在Javascript中使用了BeforeUpload
事件,如GitHub文章中所述,然后不得不在服务器端进行更改。
以前,为了获得我使用过的文件名:
var file = Request.Files[f];
var fileName = file.FileName
然而,这正是"blob
"被退回的地方。相反,我做了一个更改,所以当我仍然使用Request.Files[f]
来获取文件详细信息时,我导出了如下文件名:
var file = Request.Files[f];
var fileName = Request.Params["name"];
在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
。您也可以在这里找到帮助