Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字节[]返回的文件在MVC 3中无法正常工作_C#_Asp.net Mvc 3_File - Fatal编程技术网

C# 从字节[]返回的文件在MVC 3中无法正常工作

C# 从字节[]返回的文件在MVC 3中无法正常工作,c#,asp.net-mvc-3,file,C#,Asp.net Mvc 3,File,我最近发布了一个问题,询问如何从存储的字节[]返回文件 问题就在这里 仅供参考,我将文件的二进制文件存储为字符串 当我返回文档时,我调用以下代码: var data = document.BinData.ToByteArray(); return File(data, document.MIMEType,document.Extension); 其中,BinData是一个字符串,ToByteArray()是我写的一个扩展方法: public static byte[] ToByteArray(

我最近发布了一个问题,询问如何从存储的字节[]返回文件

问题就在这里

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

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

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;
    }
其中documentData是我存储的字符串:

下载代码如下:

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

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

其中document.BinData是上面的documentData

我敢打赌问题出在这行:

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

根据您的解码器(
ToByteArray
),这并不是真正以合适的方式编码的;注;不能将任意二进制数据视为字符串(至少不能以您尝试的方式)。这样做的首选方法是:

byte[] originalData = ...
string asString = Convert.ToBase64String(originalData);
byte[] reconstructedBinary = Convert.FromBase64String(asString);
(尽管其他几种方法——例如hex——也能奏效)

这应该会返回正确的
字节[]
,从那以后一切都会好起来


请重新阅读
流。阅读
代码,并假设您已经进行了某种超大长度检查以防止DDOS,请注意,您应该循环阅读

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();

“仅供参考,我已将文件的二进制文件存储为字符串”这句话让我充满恐惧。。。你是用什么方式编码的?你的
流.Read
行不可靠;你的结尾有很多零吗?如果是这样,我希望我能解释清楚that@CitadelCSAlum老实说,一个完整(但很小)的输入/输出示例确实会有帮助……马克,我在上面添加了一个编辑和你的建议,但仍然得到了一个类似但不同的答案。@Citadelcalum“相似但不同”你让我完全猜到了。例如,您正在处理的文件是文本吗?(因为你在哑剧中是这样说的)。一个非常基本的“这是我正在上传的文件(十六进制);这是我正在取回的文件(十六进制)”,结果是你的代码正常工作,我点击了错误的链接下载,结果是,我下载了以前的文件,这些文件有不同的编码。非常感谢你的帮助@Citadelcalum没有问题;请参阅我刚才所做的编辑,重新阅读您的
Read