如何通过阅读流来检查图像而不擦除它

时间:2015-07-25 03:22:00

标签: asp.net-mvc nancy

我有一个功能,可以在注册时将用户个人资料图像保存到服务器。

我的问题:为了安全起见,我检查图像以确保其有效类型。但是当我这样做时,我似乎擦除了流,无法将图像写入服务器。

如何检查文件的安全性而不破坏流?问题出现在函数IsValidImage

private string GetUploadedImage(HttpFile imageFile, long userId, IRootPathProvider pathProvider)
{
    // the following call wipes imageFile.Value or corrupts it
    if (!IsValidImage(imageFile.Value))
        return string.Empty;

    string path = Path.Combine(pathProvider.GetRootPath() + "/abc/", userId + Path.GetExtension(imageFile.Name));
    Directory.CreateDirectory(Path.GetDirectoryName(path));

    using (var fileStream = new FileStream(path, FileMode.Create))
    {
        imageFile.Value.CopyTo(fileStream);
    }

    return path;
}

private bool IsValidImage(Stream image)
{
    ImageFormat[] ValidFormats = new[] { ImageFormat.Jpeg, ImageFormat.Png };

    try
    {
        // this wipes or corrupts the stream. How can I avoid this?
        using (var img = Image.FromStream(image))
        {
            return ValidFormats.Contains(img.RawFormat);
        }
    }
    catch
    {
        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

一旦您从流中读取(IsValidImage使用Image.FromStream),您需要"倒带"它可以重新读取数据。

您可以通过设置位置来执行此操作:

using (var fileStream = new FileStream(path, FileMode.Create))
{
    imageFile.Value.Position= 0;
    imageFile.Value.CopyTo(fileStream);
}