Javascript 将blob转换为Excel文件并下载,文件无法打开
我有一个api,它返回下面的响应,其中包含excel文件内容 所以现在我需要将它们转换成excel文件并下载给用户 下面是api函数Javascript 将blob转换为Excel文件并下载,文件无法打开,javascript,c#,angularjs,Javascript,C#,Angularjs,我有一个api,它返回下面的响应,其中包含excel文件内容 所以现在我需要将它们转换成excel文件并下载给用户 下面是api函数 [HttpGet] [IgnoreAntiforgeryToken] public async Task<IActionResult> DownloadLoadedTrnFile(string S3Path) { try { string bucket = &quo
[HttpGet]
[IgnoreAntiforgeryToken]
public async Task<IActionResult> DownloadLoadedTrnFile(string S3Path)
{
try
{
string bucket = "taurus-" + GetEnvironmentSettings() + "-trn";
string fileName = "";
string[] fileStr = S3Path.Split('-');
if (fileStr.Count() > 0)
{
fileName = fileStr.Last();
}
Stream responseStream = await _imageStore.GetImage(bucket, S3Path);
if (responseStream == null)
return NotFound();
using (MemoryStream ms = new MemoryStream())
{
responseStream.CopyTo(ms);
var finalResult = File(System.Text.UTF8Encoding.UTF8.GetString(ms.ToArray()), MimeTypesMap.GetMimeType(S3Path), fileName);
return Ok(finalResult);
}
}
catch (Exception ex)
{
return StatusCode(500, "Error in downloading file.");
}
}
public async Task<Stream> GetImage(string bucketName, string objectKey)
{
GetObjectRequest originalRequest = new GetObjectRequest
{
BucketName = bucketName,
Key = objectKey
};
try
{
GetObjectResponse response = await S3Client.GetObjectAsync(originalRequest);
// AWS HashStream doesn't support seeking so we need to copy it back to a MemoryStream
MemoryStream outputStream = new MemoryStream();
response.ResponseStream.CopyTo(outputStream);
outputStream.Position = 0;
return outputStream;
}
catch (AmazonS3Exception ex)
{
// Not found if we get an exception
return null;
}
}
和功能
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
此函数在只有普通文本的excel中运行良好。然而,我正在尝试下载的这个excel,它有丰富的内容,如颜色边框、下拉列表、多页
当我尝试使用相同的函数下载excel文件时,它会引发以下错误:
为了帮助您更好地理解我的问题,下面是API HTTP调用
我试图在网上搜索解决方案,但没有运气。我其实不明白这里有甚么问题。任何事情都会有帮助的,谢谢。谢谢你的回复,让我的脑袋转了转最后我解决了这个问题 嗯,我发现它的问题是因为在API中我将它包装在UTF-8中。但是,它(Excel)不应该用UTF-8包装。只有当我正在下载csv文件时
var finalResult = File(System.Text.UTF8Encoding.UTF8.GetString(ms.ToArray()),
MimeTypesMap.GetMimeType(S3Path), fileName);
改为
var finalResult = File(ms.ToArray(), MimeTypesMap.GetMimeType(S3Path), fileName);
那是�' 这是个坏兆头。这看起来不像是一个有效的UTF-8 json字符串,带有正确的转义字符。我打赌它只是excel文件的原始字节,周围环绕着类似json的东西。如果您提供了一个api来下载文件,不要试图用json来包装结果。@JeremyLakeman我在这里发布了我的api函数。您的意思是api函数有问题吗?Excel
*.xlsx
文件不是文本文件。它们是二进制文件。@Dai谢谢你的回复,但很抱歉我不明白。您的意思是需要更改api。您不需要执行ms.ToArray()
,这将导致不需要的额外堆分配。您可以将流
直接传递到文件
方法。使用ControllerBase.File
重载,该重载接受流作为第一个参数。只需return File()
就是Ok(…)
将其转换为json。
var finalResult = File(ms.ToArray(), MimeTypesMap.GetMimeType(S3Path), fileName);