从byte []返回文件在MVC 3中无法正常工作

时间:2011-10-04 05:12:41

标签: c# asp.net-mvc-3 file

我最近发布了一个问题,询问如何从我正在存储的byte []中返回一个文件。

问题在于byte[] to File Type in MVC 3

仅供参考,我已经将文件的二进制文件存储为字符串。

当我退回文档时,我调用以下代码:

var data = document.BinData.ToByteArray();
return File(data, document.MIMEType,document.Extension);

其中 BinData 是一个字符串, ToByteArray()是我写的扩展方法:

public static byte[] ToByteArray(this string data)
    {
        byte[] binData= new byte[data.Length];
        for (var i = 0; i < data.Length; i++)
        {
            binData[i] = (byte)data[i];
        }
        return binData;
    }

我遇到的问题是,当我收回文件时,我得到的内容如下:

enter image description here

有什么可以看到我做错了吗?

编辑,我已将以下“上传”代码更改为以下内容:

var stream = BinData.InputStream;
                byte[] data = new byte[BinData.ContentLength];
                stream.Read(data, 0, BinData.ContentLength);

                string documentData = Convert.ToBase64String(data);

其中documentData是我正在存储的字符串:

,下载代码如下:

var data = Convert.FromBase64String(document.BinData);
return File(data,document.MimeType,document.Title + document.Extension);

其中document.BinData是上面的documentData

1 个答案:

答案 0 :(得分:2)

我打赌问题就在于:

  

仅供参考,我已经将文件的二进制文件存储为字符串。

基于您的解码器ToByteArray),这实际上并没有以合适的方式编码;注意;你不能将任意二进制数据视为字符串(至少不是你尝试的方式)。执行此操作的首选方法是:

byte[] originalData = ...
string asString = Convert.ToBase64String(originalData);
byte[] reconstructedBinary = Convert.FromBase64String(asString);

(虽然其他几种方法 - 例如hex - 也会起作用)

这应该会给你正确的byte[],而且一切都应该很好。


重新使用Stream.Read代码,并假设您已经进行了某种超大长度检查以防止DDOS,请注意您应该Read循环

int remaining = BinData.ContentLength, offset = 0, bytesRead;
byte[] data = new byte[remaining];
while((bytesRead = stream.Read(data, offset, remaining)) > 0) {
    offset += bytesRead;
    remaining -= bytesRead;
}
if(remaining > 0) throw new EndOfStreamException();