Я пытаюсь создать простую платформу загрузки / выгрузки. Обычно я загружаю файл из браузера, который отправляет их в хранилище 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, но он тоже не работает.
Любая помощь будет принята с благодарностью.