Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过Chalice API调用将文件上载到AWS S3_Python_Python 3.x_Boto3_Chalice - Fatal编程技术网

Python 通过Chalice API调用将文件上载到AWS S3

Python 通过Chalice API调用将文件上载到AWS S3,python,python-3.x,boto3,chalice,Python,Python 3.x,Boto3,Chalice,我正试图通过Chalice将一个文件上传到我的S3存储桶中(我目前正在使用它,这还是个新手)。然而,我似乎不能把它弄对 我的AWS设置正确,完成教程后成功返回一些消息。然后我试着上传/下载,问题就出现了 s3 = boto3.resource('s3', region_name=<some region name, in this case oregon>) BUCKET= 'mybucket' UPLOAD_FOLDER = os.path.abspath('') # the f

我正试图通过Chalice将一个文件上传到我的S3存储桶中(我目前正在使用它,这还是个新手)。然而,我似乎不能把它弄对

我的AWS设置正确,完成教程后成功返回一些消息。然后我试着上传/下载,问题就出现了

s3 = boto3.resource('s3', region_name=<some region name, in this case oregon>)
BUCKET= 'mybucket'
UPLOAD_FOLDER = os.path.abspath('')  # the file I wanna upload is in the same folder as my app.py, so I simply get the current folder name

@app.route('/upload/{file_name}', methods=['PUT'])
def upload_to_s3(file_name):
    s3.meta.client.upload_file(UPLOAD_FOLDER+file_name, BUCKET, file_name)
    return Response(message='upload successful',
                    status_code=200,
                    headers={'Content-Type': 'text/plain'}
    )

我让它运行起来,在一个:

您可以通过以下命令行直接使用及其进行测试:

curl -X PUT https://YOUR_API_URL_HERE/upload/mypic.jpg --upload-file mypic.jpg --header "Content-Type:application/octet-stream"
要运行此功能,您必须手动将写入s3的策略附加到lambda函数的角色。此角色由Chalice自动生成。中现有策略的旁边是由您的Chalice项目创建的角色

值得一提的是:

  • 无法写入Lambda函数的工作目录
    /var/task/
    ,但在
    /tmp/
    处有一些空间,请参阅
  • 您必须为
    @app.route
    指定接受的内容类型
    'application/octet stream'
    (并通过
    curl
    相应地上传文件)
  • HTTP PUT将文件或资源放在特定的URI上,因此要使用PUT,必须通过HTTP将此文件上载到API

您希望将哪个文件从哪里上载到哪个位置?您
app.py
已部署到AWS API和Lambda函数,即部署后“同一文件夹”可能不正确。该文件与app.py位于同一文件夹中。我还尝试使用文件的绝对路径,两者都不起作用。我想正确的问题应该是“正确的方法是什么?”按照你的步骤,我仍然得到500分。我已经为chalice用户创建了完全访问S3的权限,按照这家伙的指示:我加入了一个try/except子句,用
app.log.error(blhblah)
记录任何错误,但没有记录任何内容。我选择您的答案作为正确答案,因为我认为我的问题来自其他部分。我相信你的解决方案解决了我提出的问题。我只需要弄清楚许可的部分。如果你对此有什么看法,请与我分享:)谢谢。这是我的IAM设置的一部分,如果该设置无效的话。我通过“附加策略”添加了s3访问…我明白你的意思。我直接编辑了chalice角色(在您的例子中是hello chalice dev)的权限,这种方式(如图所示)在
chalice部署后不会被覆盖。
from chalice import Chalice, Response
import boto3

app = Chalice(app_name='helloworld')

BUCKET = 'mybucket'  # bucket name
s3_client = boto3.client('s3')


@app.route('/upload/{file_name}', methods=['PUT'],
           content_types=['application/octet-stream'])
def upload_to_s3(file_name):

    # get raw body of PUT request
    body = app.current_request.raw_body

    # write body to tmp file
    tmp_file_name = '/tmp/' + file_name
    with open(tmp_file_name, 'wb') as tmp_file:
        tmp_file.write(body)

    # upload tmp file to s3 bucket
    s3_client.upload_file(tmp_file_name, BUCKET, file_name)

    return Response(body='upload successful: {}'.format(file_name),
                    status_code=200,
                    headers={'Content-Type': 'text/plain'})
curl -X PUT https://YOUR_API_URL_HERE/upload/mypic.jpg --upload-file mypic.jpg --header "Content-Type:application/octet-stream"