Я пытаюсь создать утилиту в C # с использованием инфраструктуры MVC, где пользователь загружает изображение, которое используется для обрезки кусочков, чтобы использовать его в качестве значков миниатюр (только один пользователь будет делать это одновременно) время). Затем пользователь может загрузить другое изображение и продолжить обрезку.
У меня есть действие контроллера, которое обрабатывает загрузку файла, делая снимок, конвертируя его из любого формата в формат 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) });
}