MVC Controller,如何将图像文件直接传递给Bitmap并保存

时间:2016-10-05 13:37:11

标签: c# asp.net-mvc file bitmap gdi+

我正在尝试在mvc控制器内以指定格式保存文件, 通过将文件'InputStream'传递给Bitmap对象,并保存位图,而不是保存文件本身......因为我想处理它。

第一步,我尝试按照我的说法写一个png,然后在我的电脑上找到一个jpg文件,但是我收到以下错误:

GDI +中发生了一般性错误。

我的代码如下:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,HotelId")] Image image) //, HttpPostedFileBase file)
{
    int arrayStartX;

    if (ModelState.IsValid)
    {
        if (Request.Files.Count > 0)
        {
            var file = Request.Files[0];

            if (file != null && file.ContentLength > 0)
            {
                var fileName = Path.GetFileName(file.FileName);
                var pathMain = Path.Combine(Server.MapPath("~/Images/HotelGallery/"),
                    "Img" + image.HotelId + "_" + fileName.Remove(fileName.LastIndexOf('.')) + ".jpg");
                //file.SaveAs(path);

                try
                {
                    file.InputStream.Seek(0, SeekOrigin.Begin);
                    Bitmap mainBmp = new Bitmap(file.InputStream);
                    mainBmp.Save(pathMain, ImageFormat.Jpeg);

2 个答案:

答案 0 :(得分:0)

您可以尝试以下流代码:

// At this point the new bitmap has no MimeType
// Need to output to memory stream

    using (var m = new MemoryStream())
    {
           dst.Save(m, format);

           var img = Image.FromStream(m);

           //TEST
           img.Save("C:\\test.jpg");
           var bytes = PhotoEditor.ConvertImageToByteArray(img);


           return img;
     }

来源:A generic error occurred in GDI+, JPEG Image to MemoryStream

答案 1 :(得分:0)

虽然对我来说很难得到GDI +错误,过去面对它很多,但我从来没有想到我自己的文件系统可能会出现问题。是的,虽然我总是把GDI +视为恶魔,这次完全是我自己的错,(顺便说一句,微软应该提供更好的错误:@)问题是我没有生成目录,而且Save无法做到这一点。

所以我做了一点重构并完成了这个:

var fileName = Path.GetFileName(file.FileName);
var galleryDirectoryPath = Server.MapPath("~/Images/HotelGallery/");
var pathMain = Path.Combine(galleryDirectoryPath,
               "Img" + image.HotelId + "_" + fileName.Remove(fileName.LastIndexOf('.')) + ".jpg");

if (!Directory.Exists(galleryDirectoryPath))
{
    Directory.CreateDirectory(galleryDirectoryPath);
}

然后剩下的代码。