我最近发布了一个问题,询问如何从我正在存储的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;
}
我遇到的问题是,当我收回文件时,我得到的内容如下:
有什么可以看到我做错了吗?
编辑,我已将以下“上传”代码更改为以下内容:
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
答案 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();