Search code examples
c#.netasp.net-mvcnet-sftp

Certain big '.xlsx' extension files failed to open after downloaded via SftpClient


I am trying to download file from a remote linux server to my local computer using SftpClient.

Here is my code to download the file

        public MemoryStream DownloadFile2(string path)
        {
            var connectionInfo = _taskService.GetBioinformaticsServerConnection();
            MemoryStream fileStream = new MemoryStream();
                        
            using (SftpClient client = new SftpClient(connectionInfo))
            {
                client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(200);
                client.Connect();

                
                client.DownloadFile(path, fileStream);
                fileStream.Seek(0, SeekOrigin.Begin);
                
                var response = new MemoryStream(fileStream.GetBuffer());
                return fileStream;
            }
        }

And here is the controller that called above method.

        public FileResult DownloadFile(string fullPath, string fileName)
        {
            if (!string.IsNullOrEmpty(fileName))
            {
                fullPath = string.Concat(fullPath, "/", fileName);
            }
            var ms = _reportAPI.DownloadFile2(fullPath);

            var ext = Path.GetExtension(fullPath);
            if (ext == ".xlsx")
            {
                return File(ms, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
            }
            return File(ms, "application/octet-stream", fileName);            
        }

I have manage to do it for most of the files, however for certain large '.xlsx' extension files, when I tried to open it, for some reason, I received below error.

enter image description here

If I am on IISExpress, I still manage to open it after I clicked on 'Yes' button, but if I'm using the normal IIS, it failed to open the file after clicked on 'Yes' button.

For other type of files or smaller excel files, it works as expected.

Any idea how can I modified my code to solve this issue?


Solution

  • I was able to resolve this by modifying my code as below

            public MemoryStream DownloadFile2(string path)
            {
                var connectionInfo = _taskService.GetBioinformaticsServerConnection();
                MemoryStream fileStream = new MemoryStream();
                byte[] fileBytes = null;
                using (SftpClient client = new SftpClient(connectionInfo))
                {
                    client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(200);
                    client.Connect();
    
                    client.DownloadFile(path, fileStream);
    
                    fileBytes = fileStream.ToArray();
                    
                    var response = new MemoryStream(fileBytes);
                    return response;
                }
            }