代码之家  ›  专栏  ›  技术社区  ›  Zaid Amir

使用curl/libcurl上传到Amazon S3

  •  6
  • Zaid Amir  · 技术社区  · 16 年前

    我目前正尝试开发一个应用程序,使用CURL和C++将文件上传到Amazon S3桶。在仔细阅读了S3开发人员指南之后,我开始使用curl实现我的应用程序,并按照开发人员指南的描述形成头部,在经过大量的测试和错误后,为了确定创建S3签名的最佳方式,我现在面临着501个错误。收到的头表明我使用的方法没有实现。我不确定我错在哪里,但这里是我发送到Amazon的HTTP头:

    PUT /test1.txt HTTP/1.1
    Accept: */*
    Transfer-Encoding: chunked
    Content-Type: text/plain
    Content-Length: 29
    Host: [BucketName].s3.amazonaws.com 
    Date: [Date]
    Authorization: AWS [Access Key ID]:[Signature] 
    Expect: 100-continue
    

    出于安全原因,我截断了bucket名称、访问密钥ID和签名。

    我不确定我做错了什么,但我认为错误是由于接受和传输编码字段(不确定)而产生的。有人能告诉我我做错了什么,为什么我拿到501分吗?

    2 回复  |  直到 9 年前
        1
  •  4
  •   strugee    9 年前

    您可以执行一个bash文件。下面是一个例子 upload.sh 脚本,您可以这样运行: sh upload.sh yourfile

    #!/bin/bash
    file=$1
    bucket=YOUR_BUCKET
    resource="/${bucket}/${file}"
    contentType="application/x-itunes-ipa"
    dateValue=`date -R`
    stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
    s3Key=YOUR_KEY_HERE
    s3Secret=YOUR_SECRET
    echo "SENDING TO S3"
    signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64` 
    curl -vv -X PUT -T "${file}" \
     -H "Host: ${bucket}.s3.amazonaws.com" \
     -H "Date: ${dateValue}" \
     -H "Content-Type: ${contentType}" \
     -H "Authorization: AWS ${s3Key}:${signature}" \
     https://${bucket}.s3.amazonaws.com/${file}
    

    更多关于: http://www.jamesransom.net/?p=58

    http://www.jamesransom.net/?P=58

        2
  •  -3
  •   Zaid Amir    16 年前

    解决方法:在我的代码中缺少文件大小的curopt,现在一切都正常工作