Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将blob转换为Excel文件并下载,文件无法打开_Javascript_C#_Angularjs - Fatal编程技术网

Javascript 将blob转换为Excel文件并下载,文件无法打开

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

我有一个api,它返回下面的响应,其中包含excel文件内容

所以现在我需要将它们转换成excel文件并下载给用户

下面是api函数

   [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);