我最近刚尝试在本地上传图片时遇到此错误。我不习惯得到错误。 S3方面或代码方面没有任何变化。上传仍然可以在生产中使用。我已经尝试了所有通常的,重新启动服务器,重新启动计算机,更改到不同的浏览器,清除缓存/ cookie,更改策略中的到期,检查我的ENV变量是否存在并且是正确的....
这是我使用jQuery Fileupload的coffescript
$("input.fileupload").fileupload
url: '<%= s3_bucket_url %>'
type: 'POST'
autoUpload: true
dataType: 'xml'
paramName: 'file'
acceptFileTypes: /(\.|\/)(jpg|png)$/i
formData:
key: '<%= "tmp-uploads/#{SecureRandom.uuid}/${filename}" %>'
AWSAccessKeyId: '<%= Settings.fog.aws_access_key_id %>'
acl: 'public-read'
policy: '<%= s3_policy %>'
signature: '<%= s3_signature %>'
success_action_status: '201'
success: (data)->
# success stuff
fail: (e, data)->
# fail stuff
这是我的S3助手
module S3Helper
def s3_bucket_url
"https://#{Settings.fog.directory}.s3.amazonaws.com"
end
def s3_signature
Base64.encode64(
OpenSSL::HMAC.digest(
OpenSSL::Digest::Digest.new('sha1'),
Settings.fog.aws_secret_access_key,
s3_policy
)
).gsub(/\n/, '')
end
def s3_policy
Base64.encode64(
{
expiration: 24.hours.from_now.utc.strftime('%Y-%m-%dT%H:%M:%SZ'),
conditions: [
{ bucket: Settings.fog.directory },
{ acl: 'public-read' },
['starts-with', '$key', 'tmp-uploads/'],
{ success_action_status: '201' }
]
}.to_json
).gsub(/\n|\r/, '')
end
end
我的想法已经不多了。我需要添加“内容类型”吗?任何方向都会非常感激。
答案 0 :(得分:3)
如果是这样,你的代码没有任何改变,我的猜测是:
Why do some of my requests randomly fail with a 403 Forbidden?
检查有问题的系统时钟和时区设置 机。 Amazon S3要求所有发出请求的计算机都在15以内 亚马逊S3网络服务器时钟的分钟数。设置您的机器 除了确定它们之外,还要将它们的时间与NTP服务器同步 为最近的节日修补应该解决的补丁 这个问题。
当开发人员决定部署他们时,这是一个常见错误 申请到另一台机器。
Amazon S3的响应将包含以下内容:
- HTTP状态代码:403 Forbidden
- 错误代码:RequestTimeToo-Skewed
- 说明:请求时间与服务器时间之间的差异太大。
您必须正确设置时区,不能简单地向上或向下调整一小时。
答案 1 :(得分:0)
这可能是由于&#34;时间漂移造成的,这意味着服务器和客户端需要时间同步。如果任何一个漂移太多,您将看到策略过期错误。
Re:服务器,请注意,如果您现在在本地开发,那么您的服务器很可能在某种虚拟机中运行,无论是由Vagrant管理的VM,还是docker-machine。这意味着此实例中的服务器是来宾虚拟机,其内部时间需要正确,主机本身的时间也无关紧要。
如果您使用的是docker-machine,则可以通过执行以下操作进入实例:
docker-machine ssh name-of-machine
然后(假设* nix):
date
检查日期&amp;
sudo ntpd -q -p pool.ntp.org
更新它。