简体   繁体   English

FileContentResult 返回 excel 文件损坏

[英]FileContentResult return excel file corrupt

I am trying to download an xlsx file from an ftp but when I download and try to open it I get that it is a corrupt file.我正在尝试从 ftp 下载一个 xlsx 文件,但是当我下载并尝试打开它时,我发现它是一个损坏的文件。 . . I share the back and front code.我分享后台代码和前台代码。

public async Task<TransacResult> DownloadFileInterface(Uri serverUri, string fileName)
    {
        StreamReader sr;
        byte[] fileContent;
        try
        {
            string ftpUser = GetConfiguration()["SuatKeys:FTPSuatUser"];
            string ftpPassword = GetConfiguration()["SuatKeys:FTPSuatPassword"];

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.KeepAlive = false;
            request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
            sr = new StreamReader(request.GetResponse().GetResponseStream());
            fileContent = Encoding.UTF8.GetBytes(sr.ReadToEnd());
            sr.Close();
            sr.Dispose();
            FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync();
            var fileContentResult = new FileContentResult(fileContent, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            {
                FileDownloadName = fileName + ".xlsx"
            };
            return new TransacResult(true, fileContentResult);
        }
        catch (Exception ex)
        {
            return new TransacResult(false, new Message("SUAT-ERR-C02", MessageCategory.Error, "Conexión rechazada", ex.Message));
        }
    }

async downloadlayout() {
    var obj = this.interfaces.item;
    if (this.$store.state.usuarioActivo.modeD == 0)
      obj = serialize(obj);
    const res = await this.$store.dispatch("apiPost", {
      url: "Interface/DownloadDinamycLayout",
      item: obj
    })
    console.clear();
    console.log(res);
    const a = document.createElement("a"); 
    a.href = "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64," + res.fileContents; 
    a.download = res.fileDownloadName;
    a.click(); 
    a.remove();
},

reading the file does not present any problem Greetings读取文件不会出现任何问题问候

Assuming you the file on FTP isn't corrupted, the problem have is that.xlsx files are not textual files, but StreamReader is intended for reading text.假设您 FTP 上的文件没有损坏,问题是 .xlsx 文件不是文本文件,但StreamReader用于读取文本。 Using it as you are will corrupt arbitrary binary data (eg an.xlsx file).按原样使用它会损坏任意二进制数据(例如 an.xlsx 文件)。

I would personally just stream the file from FTP, through your server, and straight to the client:我个人只是 stream 来自 FTP 的文件,通过你的服务器,直接到客户端:

public async Task<TransacResult> DownloadFileInterface(Uri serverUri, string fileName)
{
    StreamReader sr;
    byte[] fileContent;
    try
    {
        string ftpUser = GetConfiguration()["SuatKeys:FTPSuatUser"];
        string ftpPassword = GetConfiguration()["SuatKeys:FTPSuatPassword"];

        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.KeepAlive = false;
        request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
        
        Stream ftpFileStream = request.GetResponse().GetResponseStream();
        var fileContentResult = new FileStreamResult(ftpFileStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
        {
            FileDownloadName = fileName + ".xlsx"
        };
        return new TransacResult(true, fileContentResult);
    }
    catch (Exception ex)
    {
        return new TransacResult(false, new Message("SUAT-ERR-C02", MessageCategory.Error, "Conexión rechazada", ex.Message));
    }
}

I tried three times with two Actions:我用两个动作尝试了三次:

[HttpPost]
        public FileResult download(IFormFile file)
        {
            var filestream = file.OpenReadStream(); 
            var filestreamreader = new StreamReader(filestream, Encoding.Default);          
            var fileContent1 = Encoding.Default.GetBytes(filestreamreader.ReadToEnd());
            return File(fileContent1, "application/ms-excel", "3.xlsx");
            
        }

[HttpPost]
        public FileResult download1(IFormFile file)
        {
            var filestream = file.OpenReadStream();
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            ExcelPackage package = new ExcelPackage(filestream);
            var fileContent = package.GetAsByteArray();
            return File(fileContent, "application/ms-excel", "3.xlsx");
        }

At First,I tried to read the content of txt file and xlsx file,you could see we could get the content string of txt file,but failed to get the string in xlsx file一开始,我尝试读取txt文件和xlsx文件的内容,可以看到我们可以获取到txt文件的内容字符串,但是获取不到xlsx文件中的字符串

Then I tried to get the content byte from stream again with EPPlus and succeeded The ResulT:然后我尝试再次使用 EPPlus 从 stream 获取内容字节并成功了结果:

The reason I recomanded EEplus: If Oneday we want to download the xlsx file with some extra infomation,we could just add some codes rather than delet the codes and write again codes as below;我推荐EEplus的原因:如果有一天我们想下载带有一些额外信息的xlsx文件,我们可以只添加一些代码而不是删除代码并重新编写如下代码;

[HttpPost]
        public FileResult download1(IFormFile file)
        {
            var employeelist = new List<Employee>()
            {
                new Employee(){Id=1,Name="Jhon",Gender="M",Salary=5000},
                new Employee(){Id=2,Name="Graham",Gender="M",Salary=10000},
                new Employee(){Id=3,Name="Jenny",Gender="F",Salary=5000}
            };
            
            var stream = file.OpenReadStream();
            
             
            byte[] fileContent;
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (ExcelPackage package = new ExcelPackage(stream))
            {
                // add a new worksheet to the empty workbook
                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Employee");
                
                //Set the Width and Height
                //worksheet.Column(1).Width = xx;
                //worksheet.Row(1).Height = xx;
                
                //Add the headers

                worksheet.Cells[1, 1].Value = "ID";
                worksheet.Cells[1, 2].Value = "Name";
                worksheet.Cells[1, 3].Value = "Gender";
                worksheet.Cells[1, 4].Value = "Salary (in $)";
                for(int i=0; i< employeelist.Count; i++)
                {
                    worksheet.Cells[i + 2, 1].Value = employeelist[i].Id;
                    worksheet.Cells[i + 2, 2].Value = employeelist[i].Name;
                    worksheet.Cells[i + 2, 3].Value = employeelist[i].Gender;
                    worksheet.Cells[i + 2, 4].Value = employeelist[i].Salary;
                } 
                package.Save(); //Save the workbook.
                fileContent = package.GetAsByteArray();
            }            
            return File(fileContent, "application/ms-excel", "target.xlsx");
        }

The Result:结果: 在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM