Image.FromStream(PostedFile.InputStream)失败。 (参数无

2019-08-31 18:52发布

我使用的是AsyncFileUpload(AJAX工具包)上传图片。 我有处理图像大小调整的按钮。 这已经工作得很好了一段时间,但现在不是了......

protected void BtnUploadImage_Click(object sender, EventArgs e)
{
    var imageFileNameRegEx = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)$", 
        RegexOptions.IgnoreCase);
    if (!AsyncFileUpload1.HasFile || 
        !imageFileNameRegEx.IsMatch(AsyncFileUpload1.FileName))
    {
        AsyncFileUpload1.FailedValidation = true;
        ErrorLabel.Visible = true;
        return;
    }
    ErrorLabel.Visible = false;

    var file = AsyncFileUpload1.PostedFile.InputStream;

    var img = Image.FromStream(file, false, false);

...
}

我觉得奇怪的另一件事:如果我尝试图像比80KB较小它的工作原理..!

我们试图重新启动服务器,但没有任何变化。 相同的代码运行在我的机器上的罚款。 (听说过?:))

我也试着将文件保存在服务器上,然后获取文件槽Image.FromFile(),但后来我得到“无法访问已关闭的文件。”

如何解决这个问题?

Answer 1:

我会确保在流被定位在开始:

var file = AsyncFileUpload1.FileContent;
file.Seek(0, SeekOrigin.Begin);

var img = Image.FromFile(file);

第二件事情要检查: 在requestLengthDiskThreshold设置。 除非指定此设置的......是的,80 KB默认。

注:IMO应该没有总体差异是否使用图像直接或者如果你使用一个中间的MemoryStream(比后一种情况下,你实际上是加载整个文件到内存中的事实其他两次)读取文件流。 无论哪种方式,原来的文件流将,因此流位置,CAS权,文件权限等进行阅读仍然适用。

注2:是的,通过各种手段确保这些资源的正确配置:)



Answer 2:

这是正确的,它不会工作。 问题是,你正在穿越托管/非托管边界,最近我遇到了同样的。 其他问题是,该流不直接出现和Image.FromStream不知道如何对付它。

解决的办法很简单:读一切从PostedFile到MemoryStream(只需使用new MemoryStream()使用的MemoryStream与Image.FromStream 。 这将解决您的问题。

确保创建正确使用using时你一起工作的ImageGraphicsStream秒。 所有这些实现IDisposable并在ASP.NET环境中,不使用using块得当,能够而且将导致增加内存使用和其他令人讨厌的副作用在长期运行(与ASP.NET应用程序运行也很长!)。

该解决方案应该是这个样子:

using(Stream memstr = new MemoryStream())
{
    // copy to a memory stream
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream;
    byte[] all = new byte[uploadStream.Length];
    uploadStream.Read(all, 0, uploadStream.Length);
    memstr.Write(all, 0, uploadStream.Length);
    memstr.Seek(0, SeekOrigin.Begin);
    using(Graphics g = Graphics.FromStream(memstr))
    {
         // do your img manipulation, or Save it.
    }
}

更新:交叉管理的边界问题只发生在反向(使用响应流),看来,不与载流,但我不能完全肯定。



文章来源: Image.FromStream(PostedFile.InputStream) Fails. (Parameter is not valid.) (AsyncFileUpload))