【发布时间】:2009-07-30 21:58:26
【问题描述】:
我正在尝试使用 MVC 框架在 C# 中创建一个实用程序,其中用户上传一张图片,该图片用于裁剪出用作缩略图图标的图片(在任何给定的情况下,一次只有一个用户会这样做时间)。然后用户可以上传不同的图片并继续裁剪。
我有一个控制器操作来处理文件上传并拍摄照片,将其从任何格式转换为 jpeg 并将其保存为“temp.jpg”(我知道它不是一个瘦控制器,但这只是为了测试目的)。当他们上传下一张图片时,我想用这张新图片替换那个 temp.jpg。此控制器在我的机器上的开发中工作正常,但在用户上传第一张图片并尝试用另一张图片替换后的生产中,他们收到以下错误:
“该进程无法访问该文件,因为它正被另一个进程使用”
在我看来,“temp.jpg”文件在第一次上传后被锁定,我不知道如何避免这种情况。
欢迎任何建议或替代想法。
分解我的代码的作用:
- 检查图片是否要上传 存在于服务器上,如果发现则删除它
- 按原样保存图片 它是原始文件名和扩展名
- 检查“temp.jpg”文件并在找到时将其删除
- 在 System.Drawing.Image 对象中打开原始图像以转换为 jpeg
- 将其另存为新的“temp.jpg”以替换已删除的文件。
我的代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PicUpload(DateTime sd, FormCollection collection)
{
foreach (string file in Request.Files)
{
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
if (hpf.ContentLength == 0)
continue;
string savedFileName = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory + "Content\\AdContent\\",
Path.GetFileName(hpf.FileName));
FileInfo temp = new FileInfo(savedFileName);
if (temp.Exists) temp.Delete();
hpf.SaveAs(savedFileName);
string tempFileName = AppDomain.CurrentDomain.BaseDirectory + "Content\\AdContent\\temp.jpg";
temp = new FileInfo(tempFileName);
if (temp.Exists) temp.Delete();
EncoderParameters codecParams = new EncoderParameters(1);
codecParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
Image newPic = Image.FromFile(savedFileName);
newPic.Save(tempFileName, encoders[1], codecParams);
newPic.Dispose();
FileInfo tmp = new FileInfo(savedFileName);
if (tmp.Exists) tmp.Delete();
return RedirectToAction("Create", new { startdate = String.Format("{0:MM-dd-yyyy}", sd) });
}
return RedirectToAction("Create", new { startdate = String.Format("{0:MM-dd-yyyy}", sd) });
}
【问题讨论】:
标签: c# .net asp.net-mvc image file-io