代码之家  ›  专栏  ›  技术社区  ›  Stefanvds

上传图片,重命名,制作缩略图,替换原来的图片。(优化)

  •  1
  • Stefanvds  · 技术社区  · 14 年前

    我已经创建了我在问题中描述的这些函数。但是我认为我做这件事的方式并不是最好的方式。

            [HttpPost]
            public ActionResult Create(FormCollection collection, string schooljaarparam, FlatONASAanbieder foa) {
    
            if (ModelState.IsValid) {
    
                // var r = new List<ViewDataUploadFilesResult>();
    
                foreach (string file in Request.Files) {
                    HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
                    if (hpf.ContentLength == 0)
                        continue;
    
                    //extensie nakijken. jpg, png, jpeg, of GIF. 
                    if (MvcApplication.isImage(hpf.FileName)) {
                        //Image img = new Image();
    
    
                        string savedFileName = Path.Combine(
                           AppDomain.CurrentDomain.BaseDirectory + "uploads\\ONAS\\",
                           Path.GetFileName(hpf.FileName));
                        FileInfo fi = new FileInfo(savedFileName);
    
                        int i = 1;
                        while (fi.Exists) {
                            fi = new FileInfo(savedFileName.Substring(0, savedFileName.Length - Path.GetFileName(savedFileName).Length) + Path.GetFileNameWithoutExtension(savedFileName) + " (" + i++ + ") " + Path.GetExtension(savedFileName));
                        }
                        savedFileName = fi.DirectoryName + "\\" + fi.Name;
                        hpf.SaveAs(savedFileName);
    
                        using (Image Img = Image.FromFile(savedFileName)) {
                            //Size ThumbNailSize = NewImageSize(Img.Height, Img.Width, 79);
                            Size NewSize = VerkleinMaxHoogte(Img.Size, 79);
    
                            using (Image ImgThnail = new Bitmap(Img, NewSize.Width, NewSize.Height)) {
                                //string ss = savedFileName.Substring(0, savedFileName.Length - Path.GetFileName(savedFileName).Length) + Path.GetFileNameWithoutExtension(savedFileName) + "-thumb" + Path.GetExtension(savedFileName);
                                ImgThnail.Save(savedFileName + ".tmp", Img.RawFormat);
                                ImgThnail.Dispose();
                            }
                            Img.Dispose();
                        }
                        System.IO.File.Delete(savedFileName);
                        FileInfo f = new FileInfo(savedFileName + ".tmp");
                        f.MoveTo(savedFileName);
    
    
                    } else {
                        ModelState.AddModelError("ONAS_Logo", "Het geuploadde bestand is geen afbeelding. ");
    
                    }
    
                    //r.Add(new ViewDataUploadFilesResult() {
                    //    Name = savedFileName,
                    //    Length = hpf.ContentLength
                    //});
                }
            }
    
            // return View("UploadedFiles", r);
    
            return View();
        }
    
    
        [NonAction]
        public Size VerkleinMaxHoogte(Size orig, double height) {
            double tempval = height / orig.Height;
    
            return new Size(Convert.ToInt32(tempval * orig.Width), Convert.ToInt32(height));
        }
    

    在全球.asax

        public static bool isImage(string s) {
            if (s.EndsWith(".jpg", true, null) || s.EndsWith(".jpeg", true, null) || s.EndsWith(".gif", true, null) || s.EndsWith(".png", true, null)) {
                return true;
            }
            return false;
        }
    

    所以我的做法是:

    1. 我从浏览器中获取文件
    2. 我把文件保存在磁盘上(IO,慢)
    3. 我将文件作为图像打开
    4. 我用VerkleinMaxHoogte方法计算宽度和高度
    5. 我创建缩略图并用tmp扩展保存它
    6. 我删除了原始文件
    7. 我将缩略图重命名为原始文件名(这是我想要的)

    我怎么做得更快?

    1 回复  |  直到 14 年前
        1
  •  2
  •   VinayC    14 年前

    你可以随时使用 HttpPostedFile.InputStream Image.FromStream 组合#4和#5的方法。这也将消除#8和#9。