【问题标题】:MVC Controller, How to pass an image file directly to Bitmap and save itMVC 控制器,如何将图像文件直接传递给 Bitmap 并保存
【发布时间】:2016-10-05 13:37:11
【问题描述】:

我正在尝试在 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);

【问题讨论】:

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


    【解决方案1】:

    你可以试试下面的流代码:

    // 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

    【讨论】:

    • 什么是格式?我认为它与序列化格式一起使用,当使用文件系统作为源时......什么是 dst?没有流,也没有 HttpRequestBase (Request.Files) 有 Save
    【解决方案2】:

    虽然我遇到 GDI+ 错误很困难,但过去经常遇到这种情况,但我从来没有想过我自己的文件系统可能出了问题。是的,尽管这次我总是将 GDI+ 视为恶魔,但这完全是我自己的错,(顺便说一句,微软应该提供更好的错误:@)问题是我没有生成目录,并且保存无法也可以。

    所以我做了一点重构并做到了这一点:

    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);
    }
    

    然后是其余代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2022-10-31
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多