在C#中如何将文件流直接保存到Excel文件?

3

为了让你更好地理解,我正在尝试进行一次批量下载许多附件的操作。通常情况下,这些附件需要逐个通过网站下载,并且检索附件的MVC控制器代码大致如下:

    var attachment = _attachmentsRepository.GetAttachment(websiteId, id);
    if (attachment.FileStream == null || !attachment.FileStream.CanRead)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }

     var content = new StreamContent(attachment.FileStream);
     content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = $"{id}.{attachment.Extension}" };

     return new HttpResponseMessage(HttpStatusCode.OK) { Content = content };

我想要做的是编写一个控制台应用程序来进行大量操作,将每个文件直接保存到磁盘上。目前我已经实现了单个文件的保存:
        var = attachment attachmentsRepository.GetAttachment(websiteId, resource.Id);
        attachment.FileStream.Position = 0;
        var reader = new StreamReader(attachment.FileStream);
        var content = reader.ReadToEnd();
        File.WriteAllText(someFilePath, content);

我避开了任何http特定的框架类,因为我只需要通过代码直接下载到文件而不是通过浏览器。这段代码成功生成文件,但当我打开它们时,Excel会指示它们已损坏,我怀疑这是一个编码问题。目前我正在尝试更改编码,但迄今为止没有什么运气,因此非常感谢任何帮助。


3
Excel是二进制的,你永远不应该使用文本/字符串方法来处理二进制数据。 - jdweng
1个回答

2
不要使用StreamReader处理二进制数据。 StreamReader/StreamWriter类用于在 Stream 中读取和写入可读的文本,因此它们尝试执行文本编码/解码,这可能会损坏二进制数据(我认为应该将这些类重命名为StreamTextReader / StreamTextWriter以反映它们的继承层次结构)。
要读取原始二进制数据,请直接使用Stream类的方法(例如ReadWriteCopyTo)。
尝试这个:
var attachment = ...
using( FileStream fs = new FileStream( someFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize: 8 * 1024, useAsync: true ) )
{
    await attachment.FileStream.CopyToAsync( fs );
}
< p >使用 using() 块将确保正确刷新和关闭 fs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接