さて、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 構造に保持されている画像を保存できれば完璧です。私は彼らがそこにいるべきではないことを知っています!!