我设法从Microsoft MVC获取文件的字节数组,名称和mimetype。我从使用jQuery进行的Ajax调用中获取了这些数据,并在控制台中获取了以下数据:
data: {
stream: [68, 82, 0, 0, 4, 57, 0, 0, 7, 179, 8, 6, 0, 0,…],
filename: "testFile.png",
mime: "image/png"
}
我通过MVC控制器方法获取该数据,该方法返回流的byte []和文件名和mime的两个字符串。
我需要将此流js端作为文件供用户下载。我看到了许多涉及Blob对象的方法,但仍然无法获得正确的文件。我得到一个较大的文件,例如,一个png图像,但下载的版本无效,因此无法打开。 这是我实现目标的尝试:
[...]
$.ajax({
url: myUrlToControllerMethod,
type: 'POST',
data: { fileid: myFileId},
success: function (res) {
var a = document.createElement('a');
var blob = new Blob(res.data.stream, { type: res.data.mime });
console.warn(blob)
const url = URL.createObjectURL(blob);
console.info(url)
a.href = url;
a.download = res.data.filename;
document.body.append(a);
a.click();
window.URL.revokeObjectURL(url);
},
[...]
我在哪里错了?
编辑:我添加了控制器方法:
public JsonResult DlFileAsync(int fileid)
{
var ute = GetUtente();
DlModel result = FileUtils.DlFileAsync(fileid);
result.mime = MimeMapping.GetMimeMapping(result.nomefile);
var jsonResult = Json(new GenericResponse(true, result), JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
return jsonResult;
}
其中:最后三行(jsonResult内容)是针对学到的here的MVC错误的解决方法。
GenericResponse是如下的通用数据挖掘类:
public class GenericResponse
{
public bool result { get; set; }
public object data { get; set; }
}
DlModel是用于文件信息交换的类,如下所示:
public class DlModel
{
public byte[] stream { get; set; }
public string filename{ get; set; }
public string mime { get; set; }
}
FileUtils.DlFileAsync如下:
public static DlModel DlFileAsync(int fileid)
var dbFileEntry = getFromDb(fileid);
var ret = new DlModel() {
filename = dbFileEntry.FileName,
stream = dbFileEntry.VarBinaryStream
};
return ret;
}
此处dbFileEntry是db记录,其FileName具有nvarchar(30)类型,而VarBinaryStream具有varbinary(MAX)类型。 MVC中对应的实体类如下:
public partial class FileStream : EntityGeneric
{
public int Id { get; set; }
public string FileName { get; set; }
public byte[] VarBinaryStream { get; set; }
}
我认为几乎是全部。