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 回答