2016-02-07 28 views
6

S3に写真をアップロードできないようです。オンラインで多くのリソースを見て、私はこれに明確な答えを見つけることができないようです。ここに私がこれまで持っているものがあります。私はいつも失敗したメッセージとしてエラーコード:3を取得します。Cordova/Ionic appサーバーに署名したURLでbase64の画像をS3にアップロード

クライアント側:

$scope.uploadTopicPhoto = function(imageData) { 
    var image2save = "data:image/jpeg;base64," + imageData; 
    $http({ 
     url: 'http://api.example.io/signS3upload', 
     method: "GET" 
    }).then(function (success) { 
     var options = new FileUploadOptions(); 
     options.fileKey = "file"; 
     options.fileName = success.data.key 
     options.mimeType = "image/jpeg";  
     options.chunkedMode = false; 
     options.httpMethod = 'PUT'; 

     function win(r) { 
      console.log("Code = " + r.responseCode); 
     } 

     function fail(error) { 
      alert("An error has occurred: Code = " + error.code); 
     } 

     var uri = encodeURI(success.data.signed_request); 

     var ft = new FileTransfer(); 
     ft.upload(image2save, uri, win, fail, options); 
    }); 
} 

サーバー側:

var s3 = new aws.S3(); 
    var bucketName = 'testimages'; 
    var s3_params = { 
     Bucket: bucketName, 
     Key: uuid.v4() + '.jpg', 
     Expires: 60, 
     ContentEncoding: 'base64', 
     ContentType: 'image/jpeg', 
     ACL: 'public-read' 
    }; 

    s3.getSignedUrl('putObject', s3_params, function(err, data){ 
     if (err) { 
      console.log(err); 
     } else { 
     var return_data = { 
      signed_request: data, 
      key: s3_params.Key 
     }; 
     res.json(return_data); 
     } 
}); 

CORS:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedMethod>DELETE</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>Content-*</AllowedHeader> 
     <AllowedHeader>Authorization</AllowedHeader> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

答えて

1

私はあなたのbase64で画像データの前にdata:image/jpeg;base64,を含める必要はありませんだと思います。その部分を削除して、リクエスト本体として直接base64データをアップロードしてください。

参照:https://stackoverflow.com/a/7548264/3427434およびhttp://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html#RESTObjectPUT-requests

+0

私はそうは思わない。実際には、最後のステップは、ヘッダ(canvas.toDataUrl( "image/jpeg"、0.6)も含む変数を私に残します)しかし、ヘッダーを取り除いてもエラーが発生します。コード3.いずれかがわからない – pocorschi

+0

S3 APIが呼び出されましたか?http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.htmlのように読み取り可能なエラーコードがありましたか? –

1

それは私のために働く、私はイメージファイルをREST APIに送り、APIはs3バケットでイメージをアップロードし、資格は他のファイル[save credential]から取得する。

(function() { 
function execute(rqst, q, fwk) { 
    console.log('called api') 
    var uploadedFile = rqst.files['image']; 
    console.log(rqst.files['image']); 
    var newId = fwk.uuid.v4(); 
    console.log('.........', rqst); 
    if (rqst.body.data) { 
     var image_type = rqst.body.data; 
    } else { 
     var image_type = rqst.body.image_type; 
    } 
    console.log('type', image_type, newId); 
    if (image_type && uploadedFile) { 
     if (!uploadedFile.extension) { 
      uploadedFile.extension = "png"; 
      console.log('not ex'); 
     } 
     var newPath = "images/food-images" + "/" + newId + '.' + uploadedFile.extension; 
     fwk.getAwsS3Client(function(err, awsS3Client) { 
      var params = { 
       localFile: uploadedFile.path, 
       s3Params: { 
        Bucket: fwk.config.awsS3.bucketName, 
        Key: newPath, 
       }, 
      }; 
      var uploader = awsS3Client.uploadFile(params); 
      uploader.on('error', function(err) { 
       console.error('Unable to upload' + image_type + 'photo:' + err.toString()); 
       q.resolve({ 
        status: 200, 
        data: { 
         code: 1, 
         error_message: 'Unable to upload' + image_type + 'photo.' 
        } 
       }); 
      }); 
      uploader.on('progress', function() { 
       console.log(uploader.progressAmount); 
      }); 
      uploader.on('end', function() { 
       console.log("upload" + image_type + "photo done."); 
       fwk.getAwsS3PublicUrl(newPath, function(err, publicUrl) { 
        if (err) { 
         console.error('Error getting public url: ' + err.toString()); 
         q.resolve({ 
          status: 200, 
          data: { 
           code: 1, 
           error_message: 'Error getting public url.' 
          } 
         }); 
        } else { 
         // console.log('ho gya upload',newPath,publicUrl) 
         q.resolve({ 
          status: 200, 
          data: { 
           code: 0, 
           photo_url: newPath, 
           public_photo_url: publicUrl 
          } 
         }); 
        } 
       }) 
      }); 
     }); 
    } else { 
     console.error('Error key parameter missing'); 
     q.resolve({ 
      status: 200, 
      data: { 
       code: 1, 
       error_message: 'Error Missing required key in params.' 
      } 
     }); 
    } 
} 
exports.execute = execute; 
    })(); 
1

あなたがdata:image/jpeg;base64を必要といけないcanvas.toDataURLを使用している場合は、関数によって生成されます。 btoaを使用している場合は、data:image/jpeg;base64ヘッダーを追加する必要があります。

+0

I私はこの質問を投稿して以来、このアプローチから移動しました。現在、私はCognitoを使用していて、S3に直接アップロードされた特別なアイデンティティを取得しています – pocorschi

+0

質問を残して編集し、問題の解決方法を書いて更新する。部分的な賞金を与えることができる。喜んでソートされている)) –

関連する問題