C # api: файлы MCV повреждены при загрузке из JavaScript - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать простую платформу загрузки / выгрузки. Обычно я загружаю файл из браузера, который отправляет их в хранилище BLOB-объектов Azure, затем пытаюсь загрузить их из того же браузера, но если загрузка работает нормально, загрузка дает поврежденные файлы.

Я использую .net core 2.2 для извлечения файла из хранилища BLOB-объектов Azure и отправки его обратно на сторону клиента. Я попытался загрузить их напрямую из Azure или написать их локально с помощью c #, и все работает нормально. Только когда я пытаюсь загрузить их на стороне клиента, они будут повреждены.

Я также попытался загрузить простые текстовые файлы, и после загрузки они в порядке. Однако, если я пытаюсь использовать текстовые файлы со специальными символами, указанные специальные символы получаются неправильными. Например, если я загружаю файл с содержимым "àé &" ç & éàéç &! это приведет к созданию файла с содержимым «" & »� & ���� &!

C # CODE:

[Route("download/{fileId}")]
[HttpGet()]
  public async Task<FileStreamResult> DownloadAsync(Guid fileId){
  var file = ClientPortalDbContext.Files.FirstOrDefault(f => f.Id == fileId);
  if (file == null) return null;

  // get Blob on Blob storage
  var stream = new IO.MemoryStream();
  var container = CloudBlobClient.GetContainerReference(containerName);
  bool created = await container.CreateIfNotExistsAsync();

  if (created) return;

  var blob = container.GetBlockBlobReference(blobName);
  if (blob.Exists())
  {
    await blob.DownloadToStreamAsync(target);
    target.Position = 0;
  }
  #if DEBUG
  var reader = new IO.BinaryReader(stream);
  var bytes = reader.ReadBytes((int)stream.Length);
  await 

 IO.File.WriteAllBytesAsync(IO.Path.Combine(HostingEnvironment.ContentRootPath, "filedump.bin"), bytes);
  stream.Position = 0;
  #endif
  var file = File(stream, "application/octet");
  return file;        
}   

JS CODE


downloadFile = async (fileId:string) => { 
        const userData: Msal.AuthResponse = await handleNewCall()
        return Axios.get(`MYAPI/api/files/download/${fileId}`, {
            headers: {
                'Content-Type': 'application/json',
                'responseType': "arraybuffer",
                'Authorization': 'Bearer ' + (userData.accessToken)
            },
        })
    },

function str2bytes (str:string) {
    var bytes = new Uint8Array(str.length);
    for (var i=0; i<str.length; i++) {
       bytes[i] = str.charCodeAt(i);
     }
     return bytes;
 }

downloadFile(props.accessors,onDownloadProgress).then((response: any) => {
      const blob: Blob = new Blob([str2bytes(response.data)],{type:'application/octet-stream'});
      var url: string = window.URL.createObjectURL(blob);
      const anchor: HTMLAnchorElement = document.createElement("a");
      anchor.href = url;
      anchor.download = props.title;
      anchor.click();
}

Кроме того, файл почти в два раза больше того, чем он должен быть. Я попытался поместить весь текст ответа в BLOB, не преобразовав его в UInt8array, но он тоже не работает.

Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...