图像未在App_Data文件夹中正确替换

时间:2012-07-10 11:50:30

标签: c# asp.net-mvc visual-studio-2010 app-data

好的,我有一个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中 - >文件 - &gt;图像 - &gt;图像结构将是完美的。我知道他们不应该在那里!!

1 个答案:

答案 0 :(得分:3)

要始终显示最新图片,请在图片末尾添加时间戳

<img src="folder/image.jpg?ts=<%=DateTime.Now.Ticks%>" />
像这样,图像不会被浏览器缓存,导致浏览器认为它是一个全新的图像,即使它是相同的图像或相同的图像名称