用户上传后如何用旧图像代替旧图像?

时间:2015-05-28 00:57:22

标签: javascript meteor

这里涉及两个条件:

1)当用户首次进入该页面时,图像可能已上传且未显示任何内容。

2)图片可能已经上传,在这种情况下,当上传新图片以替换它时,它应该实时显示和覆盖。

整个上传内容并立即显示,它只是在我遇到困难的情况2中更新图像。

当我上传图片时,会发生两件事情,如下所示:

uploadImage('myDirective', d_canvas, 'image/png', function (error, downloadUrl) {
  if (! error) {
    Meteor.call('updateDatabase', versionId, downloadUrl)
    Session.set('imageAvailableAt', downloadUrl)
  }
})

首先,它调用一个方法来更新数据库以添加新的url。其次,它在Session变量中设置相同的url。请注意,无论图像是否存在,网址都是相同的,如果存在则会自动覆盖。

图像审核在模板中如下所示:

{{#with uploadedImage}}
  <div class="preview-of-uploaded-image">
    <img src="{{this}}">
  </div>
{{/with}}

帮助者:

var image = Session.get('imageAvailableAt')
return image

好的,这需要处理案例1 ,并且在上传时会非常整洁地显示图像。

但很明显,当图像已经上传到此处时,没有显示任何内容,我在onRendered上设置了相同的Session变量,但是当我上传新内容时它不会更新。我尝试了不同的Session变量和条件,但没有运气。我还试过了Tracker.autorun,但根据文档中的描述,它根本不起作用,所以我也很快就放弃了。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您正面临缓存问题,浏览器正在缓存图片网址,虽然指向的实际资源已更新,但它会在一段时间内继续显示旧版本。

解决问题需要做的是在修改集合服务器端时为URL添加时间戳。

在Meteor方法中,更新集合时,请务必使用以下内容用当前时间戳装饰URL:

Meteor.methods({
  updateDatabase: function(versionId, downloadUrl){
    check(versionId, String);
    check(downloadUrl, String);
    [...]
    Collection.update({
      downloadUrl: downloadUrl + "?timestamp=" + Date.now()
    });
  }
});