🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

2回答

3205閲覧

Ajax(jQuery)を使って画像をAWS LambdaにPostし、S3に画像を保存したい

ois

総合スコア50

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2019/09/20 07:46

画像をAWSのAPI Gateway経由でLambdaにPostしたいのですが、2点ひっかかっています。
formには画像のアップロードボタンとスライドバーがあり、Post先のurlがAWSのAPI Gatewayです。API Gateway経由でAWS Lambdaを呼び出し、S3に画像を保存したいです。

困っていることの1つはCORSの対策で、API Gateway側には
Access-Control-Allow-Headers 'Content-Type,X-Amz-Date,Authorization'
Access-Control-Allow-Methods 'POST'
Access-Control-Allow-Origin '*'
が設定してあります。jQuery側で叩くと、画像をPostしているのでcontentType: falseにしているせいか、CORSに引っかかってしまいます。
どう設定するのが正しいのでしょうか。クライアント側での設定も必要であれば教えていただきたいです。

2つ目はそもそも画像の取り扱いで、var formdata = new FormData($('#form').get(0));では「data:image/jpeg;base64,/(英数字の文字列)」が取得できます。これをS3に保存したいのですが、この値自体をObjectとして保存するのだとうまく画像が保存できませんでした。(S3上にオブジェクトはできますが、壊れているとかで開けませんでした。なので、保存する対象を間違っているか、処理を間違っていると思います)
どう保存すればよいのでしょうか。

ソースコードは下記です。

html

1<form id="form" action="#!"> 2 <input type="file" name="fileupload" class="uploadFile"> 3 <input type="range" min="1" max="50" value="25" class="slider" id="hoge"> 4 <button id="submit-btn" class="btn btn-primary" type="submit">Submit</button> 5</form>

javascript

1$("#submit-btn").click(function(e){ 2 var hoge = $('#hoge').val(); 3 var formdata = new FormData($('#form').get(0)); 4 formdata.append("hoge", hoge); 5 $.ajax({ 6 url: url, 7 type: 'post', 8 contentType: false, 9 processData: false, 10 cache: false, 11 data: formdata 12 }).done(function () { 13 console.log("done"); 14 }) 15})

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/09/20 07:54

> CORSに引っかかってしまいます。 送信元と送信先のドメインは一緒ですか?
ois

2019/09/20 07:55

違うと思います。送信先はAWSのエンドポイントで、送信元はローカルなので…。
yambejp

2019/09/20 07:58

違うならajaxの処理なんですからむしろCORSで弾かれるのが正常な状態では?
ois

2019/09/20 08:06 編集

おっしゃる通りです。どうやったら弾かれなくなるかが知りたいです。 サーバ側でAccess-Control-Allow-Originで全て、メソッドでPostなどを許可しており、画像post部分の処理をなくせば正常にAWS側までajaxでpostを投げることができます。なので、画像をpostする際に追加でするべき設定を知りたいという状態です。もしご存知なら教えていただきたいです。
guest

回答2

0

自己解決

formdataに問題がありました
yambejp様のおっしゃるようにCORSの設定は問題なかったのですが、
送るデータがJSONではなかったため、AWSで弾かれていたようです。
ありがとうございました。

投稿2019/09/22 14:22

ois

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

apiを調整できるなら

Access-Control-Allow-Origin: *

だけでいけそうですけどね
ソース中urlはあえて指定されていないですが、実際には指定されているんですよね?

私のPHPのテスト環境だと

PHP

1<?PHP 2header('Content-Type: application/json'); // json 3header('Access-Control-Allow-Origin: *'); 4print json_encode($_FILES); 5

で正常に戻りますね

javascript

1<script> 2$(function(){ 3 $('#submit-btn').on('click',function(e){ 4 e.preventDefault(); 5 var fd=new FormData($(this).prop('form')); 6 fd.append("hoge","fuga"); 7 $.ajax({ 8 url:"http:・・・", 9 type:"post", 10 processData:false, 11 contentType:false, 12 cache:false, 13 data:fd, 14 }).done(function(data){ 15 console.log(data); 16 }).fail(function(xhr,err){ 17 console.log(err); 18 }); 19 }); 20}); 21</script> 22<form > 23<input type="file" name="fileupload" class="uploadFile"> 24<button id="submit-btn" class="btn btn-primary" type="submit">Submit</button> 25</form>

イベントとめるのも忘れずに

投稿2019/09/20 09:14

yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ois

2019/09/20 10:09

ありがとうございます。 urlは指定しております。 yambejp様のコードを参考に、イベントを止めて、一応PHPにあるようなヘッダーをajaxを送る際に付与しました。 Access to XMLHttpRequest at '指定したurl' from origin 'null' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response. というエラーが出ました。 API GatewayではContent-Type 、Access-Control-Allow-Originの他にAccess-Control-Allow-Originも指定しております。 こちらの設定はどうすればいいかご存知でしょうか。検索してもうまく見つけられませんでした…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問