amazon-web-services - 将视频上传到aws S3

标签 amazon-web-services amazon-s3 video aws-lambda

我正在尝试使用 API 接口(interface)将视频上传到 S3 存储桶,我遵循了预签名 URL 过程,这是返回预签名 URL 的 lambda 函数(它正确地返回了预签名 URL - 看起来):

import json
import base64
import boto3
import uuid
BUCKET_NAME = 'redacted-bucket-instance'

def lambda_handler(event, context):
    actionId = uuid.uuid4()
    file_path = "video_uploads/" + str(actionId) + ".mp4"
    s3 = boto3.client('s3')
    s3Params = {
        "Bucket": BUCKET_NAME,
        "Key": file_path,
        "ContentType": 'video/mp4',
        "ACL": 'public-read'
    }
    try:
        s3_response = s3.generate_presigned_url('put_object', Params=s3Params, ExpiresIn=3600, HttpMethod="PUT")
    except Exception as e:
        raise IOError(e)
    return {
        'statusCode': 200,
        'body': {
            'file_path': file_path,
            'url': s3_response
        }
    }

当我尝试使用curl上传mp4视频时,例如: curl -X PUT -F 'data=@ch01_00000100055009702.mp4' https://redacted-bucket-instance.s3.amazonaws.com//video_uploads/a845a97f-a218-4815-a836-376e498a4334.mp4?AWSAccessKeyId=ASIAWZPXMJR5V7GEHUJJ&Signature=zDsdfsdfqsdfD&content-type=video%2Fmp4&x-amz-acl=public-read&etc

curl -X PUT --data-binary '@ch01_00000100055009702.mp4' https://redacted-bucket-instance.s3.amazonaws.com//video_uploads/a845a97f-a218-4815-a836-376e498a4334.mp4?AWSAccessKeyId=ASIAWZPXMJR5V7GEHUJJ&Signature=zDsdfsdfqsdfD&content-type=video%2Fmp4&x-amz-acl=public-read&etc

在这两种情况下,终端都会关闭...我在这里做错了什么?

(当然,这两个网址都不是收到的网址,只是用于演示)

编辑

为网址添加引号会阻止终端关闭并给出响应。(我猜测需要转义一些字符)

现在我收到此错误:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>ASIAWZPXMJR54PMEJVPQ</AWSAccessKeyId>

我应该在请求中添加 header 才能使其正常工作吗?

(我更新了预签名网址以确保其在测试期间有效)

最佳答案

对我来说,解决方案是首先为网址添加引号(如编辑中所述),然后添加 Content-Type header

-H "Content-Type:video/mp4"
  • “:”和视频之间不能有空格,否则也会导致错误(至少在我的情况下)

关于amazon-web-services - 将视频上传到aws S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63346724/

相关文章:

amazon-web-services - EC2 用户权限

amazon-s3 - 允许 API 用户使用 Cognito 身份池中的执行角色运行 AWS Lambda

iframe - 如何播放和暂停嵌入的线蜡视频?

python - 在解复用的数据包中找不到 NAL 开始

ruby-on-rails - 使用 AWS Elastic Beanstalk 和 Ruby 容器设置私有(private) Github 访问

java - 如何连接从 Java 中的 Kinesis Video Stream 获取的剪辑

mysql - SQL 查询在两个不同的 Mysql AWS 服务器中的工作方式不同

ruby-on-rails - 使用雾/webmock 进行 Rails 测试

amazon-s3 - CloudFormation 支持 "Expired Object Delete Marker"

opengl - 如何在不复制到CPU内存的情况下将ffmpeg纹理转换为Open GL纹理