【发布时间】:2015-06-09 10:01:56
【问题描述】:
我有以下方法可以调整给定图像的大小并缓存它
[OutputCache(Duration = 3600, VaryByParam = "id")]
public ActionResult UserFace(int id)
{
var cacheKey = String.Format("userPhotoURICacheKey_{0}", id);
var defaultFileCacheKey = String.Format("userPhotoDefaultCacheKey");
HttpContext.Cache[cacheKey] = HttpContext.Cache[cacheKey] ?? UserService.GetPhotoURI(id) ?? string.Empty;
var userPhoto = (String)HttpContext.Cache[cacheKey];
if (!string.IsNullOrEmpty(userPhoto))
{
var filename = id + ".jpg";
//crop and resize
var image = Image.FromFile(new Uri(userPhoto).LocalPath);
const int resW = 200;
const int resH = 200;
var minEdge = Math.Min(image.Width, image.Height);
var scaleFactor =(float) minEdge/Math.Min(resH, resW);
var newImage = new Bitmap(resW, resH);
var sufrace = Graphics.FromImage(newImage);
sufrace.InterpolationMode = InterpolationMode.HighQualityBicubic;
sufrace.DrawImage(image, 0, 0, image.Width / scaleFactor, image.Height / scaleFactor);
var stream = new MemoryStream();
newImage.Save(stream, ImageFormat.Jpeg);
stream.Position = 0;
var file = File(stream, "image/jpg", filename);
return file;
}
HttpContext.Cache[defaultFileCacheKey] = HttpContext.Cache[defaultFileCacheKey] ?? File("~/Content/images/no_photo.jpg", "image/jpg", "nophoto.jpg");
return (FileResult)HttpContext.Cache[defaultFileCacheKey];
}
在另一种方法中,我正在尝试用新的图像更新缓存的图像
public void UploadUserImage(byte[] arr, int userId)
{
Stream stream = new MemoryStream();
stream.Write(arr, 0, arr.Length);
using (var dataManager = factory.GetDataManager())
{
var userRepository = dataManager.GetRepository<IUserRepository>();
var user = GetByID(userId);
user.PhotoURI =
storageFactory.CreateFileStorageSender()
.Send(storageConfig.UsersPhotoPath, user.Id.ToString(), stream);
user.PhotoSize = stream.Length;
userRepository.Save(user);
dataManager.Commit();
}
}
我收到“该进程无法访问该文件,因为它正被另一个进程使用”错误。
【问题讨论】:
-
尝试搜索。处理您的图像。
-
UserFace中的Image和UploadUserImage中的Stream,都需要在using块中。UserFace中的MemoryStream应该继续不在using块中,因为它成为由File调用创建的FileStreamResult的一部分。执行结果时,ASP.NET MVC 将在FileStreamResult上调用Dispose。
标签: c# asp.net asp.net-mvc caching system.io.file