Конвертировать MVC bytearray в загружаемый файл javascript - PullRequest
0 голосов
/ 13 февраля 2020

Мне удалось получить от 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; }
}

Я думаю, что это почти все.

...