2016-02-07 2 views
6

Я не могу получить фотографию для загрузки на S3. Посмотрел на множество ресурсов в Интернете, и я не могу найти определенного ответа на этот вопрос. Вот что я до сих пор. Я всегда получаю код ошибки: 3 как мое сообщение об ошибке.Кордова/Ионное приложение, загружающее base64 изображение в S3 через сервер, подписанный url

стороне клиента:

$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

Я думаю, вам не нужно включать data:image/jpeg;base64, перед вашими данными 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). Но даже когда я снимаю заголовки, я получаю сообщение об ошибке. Код ошибки 1, как и другой, который является ошибкой Код 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

Если вы используете canvas.toDataURL вы не нужны data:image/jpeg;base64, она порождается функцией. Если вы используете btoa, вам нужно будет добавить заголовок data:image/jpeg;base64.

+0

I поставьте заголовки там, чтобы вы знали, что заголовки действительно установлены правильно. Я использую действительно toDataURL. Я перешел от этого подхода с момента публикации этого вопроса. Сейчас я использую Cognito и загружаю непосредственно на S3 с полученной специальной идентификацией через Cognito. Что мне делать с вопросом и щедростью? – pocorschi

+0

Оставьте вопрос, отредактируйте его и напишите и обновите, как вы решили проблему. Вы можете дать частичную награду. Рад, что это отсортировано)) –

Смежные вопросы