如何从 HttpPostedFile InputStream 属性中读取正确的 Stream/byte[]?
Posted
技术标签:
【中文标题】如何从 HttpPostedFile InputStream 属性中读取正确的 Stream/byte[]?【英文标题】:How do I read the correct Stream/byte[] from HttpPostedFile InputStream property? 【发布时间】:2021-03-06 11:13:27 【问题描述】:我得到一个正在上传的HttpPostedFile
(应该是pdf),我必须使用它的stream
在PdfSharp 中对其进行初始化。
问题是,尽管HttpPostedFile
SaveAs()
方法保存了一个有效的pdf,但保存它的InputStream
不会创建一个有效的pdf,所以当我在PdfSharp 上使用InputStream
来阅读它抛出的pdf 时“无效 Pdf”的异常,并保存 InputStream
byte[]
我试图这样:
public byte[] GetBytesFromStream(System.IO.Stream uploadedFile)
int length = Convert.ToInt32(uploadedFile.Length); //Length: 103050706
string str = "";
byte[] input = new byte[length];
// Initialize the stream.
System.IO.Stream MyStream = uploadedFile;
// Read the file into the byte array.
MyStream.Read(input, 0, length);
return input;
这样调用方法:
byte[] fileBytes = GetBytesFromStream(uploadedFile.InputStream);
但是从这些字节创建文件也会创建一个无效的 pdf...
我从这样的字节创建文件...
System.IO.File.WriteAllBytes("Foo.pdf", fileBytes);
我对此有两个问题:
1st - 为什么我从 InputStream 收到的流无效,而 SaveAs 有效。
第二个 - 我如何从 inputStream 或 HttpPostedFile 获取正确的流,而不将文件保存到磁盘然后读取它。
【问题讨论】:
检查InputStream的位置,可能不是0,所以在读入字节数组之前先设置为0。 我不知道该说什么,但是,谢谢!我怎么没想到!非常感谢! 【参考方案1】:注意到这个问题没有得到回答(因为 Evk 的评论是解决方案),我无法接受任何答案。
所以我做这个只是为了不让这个问题悬而未决。
tl;博士; 根据 Evk 的评论,解决方案是流的位置,它是预先读取的,在尝试创建 pdf 之前将位置设置为 0 足以解决问题。
【讨论】:
以上是关于如何从 HttpPostedFile InputStream 属性中读取正确的 Stream/byte[]?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合?
在 ASP.NET MVC 中使用 FileShare.ReadWrite 和 HttpPostedFile