0

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

4

1 に答える 1

3

常に最新の画像を表示するには、画像の URL の末尾にタイムスタンプを追加します

<img src="folder/image.jpg?ts=<%=DateTime.Now.Ticks%>" />

このように、画像はブラウザーによってキャッシュされません。ブラウザーは、同じ画像または同じ画像名であっても、まったく新しい画像と見なすためです。

于 2012-07-10T11:58:01.077 に答える