21889


curlコマンドでS3に画像をアップロードしたいです。  
その場合curlコマンドはどのように指定してあげれば良いのか分からずにいます。

テストしたcurlコマンド

[code]

    curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST -d '{"user" : {"image" : "@test.jpg"}}' http://localhost:3000/api/v1/users.json
    
[/code]

jsonのurlを叩いて、urlの欄にS3のURLが見えることがゴールなのですが、表示されません。  
使用しているフレームワークはRailsで、carrierwaveというgemを使用しています。  
適切なコマンドが知りたいです。  
何卒よろしくお願いいたします。

追記

以下のコードでローカルにpostされた画像をS3に指定しています。  
[参考リンク](http://qiita.com/ryo-ichikawa/items/a30dc626cba1ec909d57)

initializers/carrierwave.rb

[code]

    CarrierWave.configure do |config|
      config.fog_credentials = {
        :provider               => 'AWS',
        :aws_access_key_id      => ENV['AWS_ACCESS_KEY'],
        :aws_secret_access_key  => ENV['AWS_SECRET_KEY'],
        :region                 => s3-ap-northeast-1,
        :path_style             => true
    }
    
    config.fog_public     = true
    config.fog_attributes = {'Cache-Control' => 'public, max-age=86400'}
    
    case Rails.env
      when 'production'
        config.fog_directory = 'bucket'
        config.asset_host = 'http://s3-ap-northeast-1.amazonaws.com/buket'
      when 'development'
        config.fog_directory = 'bucket-dev'
        config.asset_host = 'http://s3-ap-northeast-1.amazonaws.com/bucket-dev'
      end
    end
    
[/code]

追記2  
api/v1/users_controller.rb

[code]

    class Api::V1::UsersController < ApplicationController
      def index
        @users = User.all
      end
    
      def create
        @user = User.new(user_params)
        respond_to do |format|
          if @user.save
            format.json { render json: 'good', status: :created }
          else
            format.json { render json: 'bad', status: :unprocessable_entity }
          end
        end
      end
    
      def user_params
        params.require(:user).permit(:image)
      end
    end
    
[/code]

Railsアプリにアップロードした画像をS3に保存（さらにcurlで動作テスト）したいです。  
画像をcurlで送信、JSONフォーマットで受け取りが不明確のままでいます。  
よろしくお願いいたします。


CC BY-SA 3.0
2016-02-08T08:39:31.073
21849
2016-02-13T01:20:16.817
2016-02-13T01:20:16.817
14328
14328
question
ruby-on-rails aws api amazon-s3 carrierwave
curlでAmazon S3に画像をアップロードしたい


[Amazon S3 Authentication Tool for Curl](http://aws.amazon.com/code/128)
を試してみてはどうでしょう。

Amazon S3の認証に必要なcurlのパラメータ指定をまとめてくれるPerlスクリプトらしいです。

実行例

[code]

    ./s3curl.pl \
      --id=[aws-access-key-id] \
      --key=[aws-secret-access-key] \
      --put=test.jpg \
      -- \
      http://s3.amazonaws.com/[bucket-name]/[key-name]
    
[/code]


CC BY-SA 3.0
2016-02-09T05:57:50.833
21889
2016-02-09T06:47:59.593
2016-02-09T06:47:59.593
2391
2391
21849
answer


>
[code]

>     curl -v -H 'Content-Type: application/json' -H 'Accept:
> application/json' -X POST -d '{"user" : {"image" : "@test.jpg"}}'
> http://localhost:3000/api/v1/users.json
>  
[/code]

これでは画像を送信していることにはなりません。`@test.jpg`という文字列がそのまま送信されています。

curlに@filenameと言う形式でファイルの中身を送信する機能はあるのですが、このような状況で適用する方法があるかはわかりません。

そもそも、JSONはテキストフォーマットなので、バイナリデータを送信するには向きません。

クライアント→Rails&CarrierWave→S3と言う構成のようですが、複数のレイヤで構成されているのであれば

  * クライアントが意図したデータを送信しているか
  * サーバ(アプリケーション)が意図した通りにデータを受け取っているか
  * バックエンドストレージであるS3に意図したリクエストが飛んでいるか

など、各レイヤを切り分けて確認するとよいでしょう。


CC BY-SA 3.0
2016-02-09T11:19:44.070
21907
2016-02-09T11:19:44.070
5793
21849
answer