Мне удалось получить от Microsoft MVC байтовый массив файла, его имя и mimetype. Я получаю эти данные из Ajax вызова, сделанного с помощью jQuery, и получаю в консоли следующие данные:
data: {
stream: [68, 82, 0, 0, 4, 57, 0, 0, 7, 179, 8, 6, 0, 0,…],
filename: "testFile.png",
mime: "image/png"
}
Я получаю эти данные с помощью MVC метода контроллера, который возвращает байт [] для поток и две строки для имени файла и mime.
Мне нужно сделать этот поток js side файлом для загрузки пользователем. Я видел много подходов с использованием объекта 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) являются обходным путем для ошибки MVC, как изучено здесь .
GenericResponse - это обобщенный класс обмена данными c следующим образом:
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.DlFileAsyn c выглядит следующим образом:
public static DlModel DlFileAsync(int fileid)
var dbFileEntry = getFromDb(fileid);
var ret = new DlModel() {
filename = dbFileEntry.FileName,
stream = dbFileEntry.VarBinaryStream
};
return ret;
}
Здесь dbFileEntry - это запись базы данных, которая имеет тип nvarchar (30) для FileName и varbinary (MAX) для VarBinaryStream. Соответствующий класс сущностей в MVC выглядит следующим образом:
public partial class FileStream : EntityGeneric
{
public int Id { get; set; }
public string FileName { get; set; }
public byte[] VarBinaryStream { get; set; }
}
Я думаю, что это почти все.