从字节数组

时间:2016-07-20 16:55:47

标签: c# image bytearray jpeg

我有一个程序,用户可以在其中保存合同附件。附件在数据库中保存为varbinary。然后,用户可以查看附件。

我在查看文件时将文件保存到临时位置,然后在关闭进程后删除文件。这适用于word和excel文档,但不适用于jpeg文件。

File.WriteAllBytes(@"C:\Temp\" + SelectedAttachment.FileName + SelectedAttachment.FileType, SelectedAttachment.FileBlob);

                //open the file for viewing
                var attachmentProcess = System.Diagnostics.Process.Start(@"C:\Temp\" + SelectedAttachment.FileName + SelectedAttachment.FileType);
                attachmentProcess.WaitForExit();


                //Delete temp file after user closes the file
                File.Delete(@"C:\Temp\" + SelectedAttachment.FileName + SelectedAttachment.FileType);

attachmentProcess.WaitForExit();抛出'System.NullReferenceException'但在.jpeg打开时未在用户代码错误中处理。无论错误如何,文件都将打开,但在关闭文件时不会删除。

我尝试过使用

using (Image image = Image.FromStream(new MemoryStream(SelectedAttachment.FileBlob)))
                {
                    image.Save("output.jpg", ImageFormat.Jpeg);  
                }

但我得到一个错误,指出“'Image':在using语句中使用的类型必须可以隐式转换为'System.IDisposable'

有没有办法让.jpeg文件进程像word或excel文件一样运行,或者我应该使用MemoryStream路由,如果有的话,我在那里做错了什么?

1 个答案:

答案 0 :(得分:1)

你正在使用一个static version的Process.Start方法并传入一个文件名(由于它是一个图像,我猜它被视为一个网址并在网页浏览器中打开文件:///您的文件路径/文件名)。这实际上返回null而不是进程,因此您的错误。您应该将程序名称(例如您的Web浏览器)和文件名作为参数传递(使用方法的this版本)。

否则,请考虑创建一个流程对象(通过new关键字,可能包含在using语句中)并使用给定的StartInfo属性调用该实例上的start方法。这将确保您有一个等待退出的实际过程对象。