好的,所以我有一个 Visual Studio 项目,用户上传的所有文件、图像等都放入 App_Data 文件夹中。在我允许用户替换图像之前,这工作得非常好。
我有一个非常具体的问题,当图像被替换时,因为图像是相同的文件名,所以图像与旧图像保持相同。这很好,这只是因为图像被缓存了。但是,您会期望当我删除缓存并重新加载页面时,会显示新图像。
即使正确的图像位于 App_Data 文件夹中,它也会显示损坏的图像图标。我觉得这很奇怪,所以我重建了项目并刷新了页面。然后,这带来了新的形象。
我的问题是,为什么这个设计需要重建才能正确刷新图像?图像不是从 App_Data 明确提供的:
<img src="@Html.ImageAssetUrl(asset.ImageAssetId)" alt="@asset.FileDescription" style="width: 100px;" />
[OutputCache(Duration = 60 * 60 * 24 * 30, Location = OutputCacheLocation.Any)]
public ActionResult Image(int assetId, string fileName, string extension, int? cropSizeId)
{
ImageAsset asset = imageAssetService.Single(assetId, fileName, extension, true);
if (asset == null)
return FileAssetNotFound("Image could not be found");
string filePath = null;
if (cropSizeId.HasValue)
{
if (asset.ImageCropSizeId.HasValue && asset.ImageCropSizeId.Value == cropSizeId.Value)
{
filePath = Server.MapPath(string.Format("~/App_Data/Files/Images/{0}-{1}.{2}", assetId, asset.ImageCropSizeId.Value, asset.Extension));
}
else
{
foreach (var crop in asset.ImageAssetCrops)
{
if (crop.ImageCropSizeId == cropSizeId.Value)
{
filePath = Server.MapPath(string.Format("~/App_Data/Files/Images/{0}-{1}.{2}", assetId, crop.ImageCropSizeId, crop.Extension));
break;
}
}
}
}
else
{
filePath = Server.MapPath(string.Format("~/App_Data/Files/Images/{0}.{1}", assetId, asset.Extension));
}
// TODO: Show a better error message
if (string.IsNullOrEmpty(filePath) || !System.IO.File.Exists(filePath))
return FileAssetNotFound(string.Format("Image file {0} not found on disk", filePath));
else
return new FilePathResult(filePath, FileUtil.GetContentType(extension));
}
注意:我不是这样设计的,所以如果我可以保留保存在 App_Data -> Files -> Images -> Image 结构中的图像,那将是完美的。我知道他们不应该在那里!!