Filepicker を使用して、クライアントのコンピューターからイメージを「読み取り」、「保存」します。Filepicker を使用して画像のサイズを変更したいのですが、常に 403 エラーが発生します。
POST https://www.filepicker.io/api/file/w11b6aScR1WRXKFbcXON/convert?_cacheBust=1380818787693 403 (FORBIDDEN)
「read」、「store」、「convert」の呼び出しに同じセキュリティ ポリシーと署名を使用しています。これは間違っていますか?"read" と "store" が呼び出されたとき、まだファイル ハンドルがないためです (たとえば、InkBlob.url の最後の文字列部分)。しかし、「保存」インクブロブで返されたファイルハンドルを使用して「変換」ポリシー/署名を生成する必要があるようですか? この場合、javascript で行うより便利な方法は何ですか? 「変換」では、セキュリティ ポリシーを生成する Python 関数には、そのための API 呼び出しを作成しない限りアクセスできないためです。
以下のコード スニペット (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 であるため、私 (元同僚のコード) には疑わしいです。