我使用 Filepicker 从客户的计算机“读取”然后“存储”图像。现在我想使用 Filepicker 调整图像大小,但总是得到 403 错误:
POST https://www.filepicker.io/api/file/w11b6aScR1WRXKFbcXON/convert?_cacheBust=1380818787693 403 (FORBIDDEN)
我对“读取”、“存储”和“转换”调用使用相同的安全策略和签名。这是错的吗?因为当调用“read”和“store”时,还没有文件句柄(例如 InkBlob.url 中的最后一个字符串部分)。但似乎必须使用“存储”InkBlob 返回的文件句柄生成“转换”策略/签名?如果是这种情况,在javascript中更方便的方法是什么?因为在“转换”中,除非我为此编写 API 调用,否则我无法访问生成安全策略的 Python 函数。
我的代码片段如下(initialFpSecurityObj 是在 Python 中使用空句柄预先生成的):
filepicker.store(thumbFile, {
policy: initialFpSecurityObj.policy,
signature: initialFpSecurityObj.signature,
location: "S3",
path: 'thumbs/' + initialFpSecurityObj.uniqueName + '/',
},function(InkBlob){
console.log("Store successful:", JSON.stringify(InkBlob));
processThumb(InkBlob);
}, function(FPError){
console.error(FPError.toString());
});
var processThumb = function(InkBlob){
filepicker.convert(InkBlob, {
width: 800,
height: 600,
format: "jpg",
policy: initialFpSecurityObj.policy,
signature: initialFpSecurityObj.signature,
}, function(InkBlob){
console.log("thumbnail converted and stored at:", InkBlob);
}, function(FPError){
console.error(FPError);
};
}
非常感谢您的帮助。
- - 编辑 - -
下面是生成 initialFpSecurityObj 的 Python 代码片段
def generateFpSecurityOptions(handle, userId, policyLife=DEFAULT_POLICY_LIFE):
expiry = int(time() + policyLife)
json_policy = json.dumps({'handle': handle, 'expiry': expiry})
policy = base64.urlsafe_b64encode(json_policy)
secret = 'XXXXXXXXXXXXXX'
signature = hmac.new(secret, policy, hashlib.sha256).hexdigest()
uniqueName = hashlib.md5()
uniqueName.update(signature + repr(time()))
uniqueName = uniqueName.hexdigest() + str(userId)
return {'policy':policy, 'signature':signature, 'expiry':expiry, 'uniqueName':uniqueName}
fp_security_options = generateFpSecurityOptions(None, request.user.id)
然后在 django 模板中检索 fp_security_options:
var initialFpSecurityObj = {{fp_security_options|as_json|safe}};
生成 fp_security_options 的方式对我来说是可疑的(前同事的代码),因为句柄是 None。