如何从 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[]?的主要内容,如果未能解决你的问题,请参考以下文章

怎么把BASE64转换成HttpPostedFile求救了

使用 HttpPostedFile 编辑视图模型绑定

为啥 ASP.NET MVC HttpFileCollection 会返回字符串数组而不是 HttpPostedFile 集合?

在 ASP.NET MVC 中使用 FileShare.ReadWrite 和 HttpPostedFile

如何正确实现过滤 data_inputs 的 Neuraxle 管道步骤?

从多个/不同文件INPUTS访问文件到JS Var