У меня сильно болит голова из-за следующего:
private bool AddImageToUser (фото HttpPostedFileBase) { строка userId = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).UserData.Split('|')[0]; строка newPath = "", путь = ""; строка userDir = System.Web.HttpContext.Current.Server.MapPath(vars.getKeyValue("usersImagesPath") + "/" + userId); System.IO.Directory.CreateDirectory(userDir);//создаем каталог, если он не существует bool действительный = ложь; пытаться { путь = Directory.GetFiles(userDir, "*foto_perfil.*").First(); if (path.Length > 0 && путь!= null) { строка fileNameWithoutExtension = Path.GetFileNameWithoutExtension(path); newPath = path.Replace(fileNameWithoutExtension, fileNameWithoutExtension + "_old"); System.IO.File.Move(путь, новыйПуть); //Исключение, о котором я говорю, происходит с этим File.Move } } ловить { } //добавляем новое изображение и заменяем старое пытаться { HttpPostedFileBase attFile = фото; int AttachFileLength = attFile.ContentLength; если (attachFileLength > 0) { строка _name = attFile.FileName; _name = _name.Substring(_name.LastIndexOf('\\') + 1); строка nome_ficheiro = DateTime.Now.ToString("ddMMyyyyhhmmfff") + "foto_perfil." + Path.GetExtension(attFile.FileName).Substring(1).ToLower(); attFile.SaveAs(System.Web.HttpContext.Current.Server.MapPath(vars.getKeyValue("usersImagesPath") + "/" + userId + "/" + nome_ficheiro)); //falta fazer o upload do ficheiro если (newPath != "") System.IO.File.Delete(newPath); действительный = правда; } } ловить { //Если при сохранении нового изображения произошла ошибка, верните старое, если оно существует System.IO.File.Move(путь, новыйПуть); действительный = ложь; } возврат действителен; } Я пытаюсь найти полный путь к единственному файлу изображения, находящемуся в каталоге, а затем в переменной «newPath» я получаю тот же путь, но с переименованием. Но когда я добираюсь до File.Move, цель которого состоит в том, чтобы переименовать файл с помощью «newPath», я чаще всего получаю ошибку:
Процесс не может получить доступ к файлу... поскольку он используется другим процессом
StackTrace
StackTrace " em System.IO.__Error.WinIOError(Int32 errorCode, String mayFullPath)\r\n em System.IO.__Error.WinIOError()\r\n em System.IO.File.InternalMove( String sourceFileName, String destFileName, Boolean checkHost)\r\n em System.IO.File.Move(String sourceFileName, String destFileName)\r\n em PGR_01.Controllers.AccountController.AddImageToUser(HttpPostedFileBase photo) em c:\\Dev \\Вебсайты\\MVC\\PGR_01\\PGR_01\\Controllers\\AccountController.cs: строка 409" строка Кстати, на той же странице Razor, которую я использую для загрузки нового изображения, я показываю последнее загруженное изображение, получая путь с настраиваемым атрибутом:
На странице:
код:
public static MvcHtmlString pathOfUserPhoto (этот HtmlHelper htmlHelper) { строка userId = FormsAuthentication.Decrypt(HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value).UserData.Split('|')[0]; строка htmlString, userDir = System.Web.HttpContext.Current.Server.MapPath(vars.getKeyValue("usersImagesPath") + "/" + userId); //с использованием //{ пытаться { htmlString = Directory.GetFiles(userDir, "*foto_perfil.*").First(); } ловить { htmlString = ""; } вернуть новый MvcHtmlString(htmlString); // возвращаем MvcHtmlString.Empty; } Я не думаю, что это имеет к этому какое-то отношение.
Что я делаю не так? Есть ли лучший способ сделать это?
Примечание: эта ошибка никогда не возникает, если папка пуста. Примечание 2. Если я попытаюсь удалить файл вручную после загрузки, иногда у меня не получается, потому что он говорит, что он уже используется «рабочим процессом IIS Express»
РЕДАКТИРОВАТЬ:
Я нашел причину блокировки: это следующий IHttpHandler, который я вызываю в источнике элемента img. Могу ли я что-нибудь сделать, чтобы предотвратить блокировку изображения?
публичный класс imgLoader2: IHttpHandler { public void ProcessRequest (контекст HttpContext) { int Ширина = 0; int Высота = 0; строка imgFile = vars.serverFolder; строка imgName = context.Request.QueryString["img"]; //string def = "/upload/blank.jpg"; строка def = "/Uploads/blank.jpg"; System.Drawing.Image imgPhoto = null; Формат изображения = ImageFormat.Jpeg; context.Request.ContentType = "изображение/jpeg"; ImageResize imgUtil = новый ImageResize(); // HttpContext.Current.Response.Cache.SetExpires(yourCalculatedDateTime); context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddDays(8)); context.Response.Cache.SetLastModified(DateTime.Now); если (string.IsNullOrEmpty (imgName)) imgName = защита; если (context.Request.QueryString.Count > 0) { если (context.Request.QueryString["h"] != null) Высота = Convert.ToInt16(context.Request.QueryString["h"]); если (context.Request.QueryString["w"] != ноль) Ширина = Convert.ToInt16(context.Request.QueryString["w"]); если (!string.IsNullOrEmpty(imgName)) { imgPhoto = imgUtil.imgThumbCropTop(imgFile + imgName, Ширина, Высота); } еще { imgPhoto = imgUtil.imgThumbCropTop(context.Server.MapPath("~/" + def), Ширина, Высота); } //imgPhoto = imgUtil.imgThumb(imgFile + imgName, Height); } еще { imgPhoto = imgUtil.imgThumbCropTop(context.Server.MapPath("~/" + def), Ширина, Высота); } if (imgName.ToLower().EndsWith(".gif")) { формат = ImageFormat.Gif; context.Response.ContentType = "изображение/gif"; } иначе если (imgName.ToLower().EndsWith(".png")) { формат = ImageFormat.Png; context.Response.ContentType = "изображение/png"; } еще { формат = ImageFormat.Jpeg; context.Response.ContentType = "изображение/jpeg"; } пытаться { imgPhoto.Save(context.Response.OutputStream, формат); } ловить { //context.Request.ContentType = "изображение/gif"; imgPhoto = imgUtil.imgThumbCrop(context.Server.MapPath("~/" + def), Ширина, Высота); imgPhoto.Save(context.Response.OutputStream, формат); } } public bool IsReusable { получать { вернуть ложь; } } }