Reactjs 如何使用react和django rest框架将图像上载到aws s3
我正在尝试使用react和drf将图像上载到aws s3。我正在关注这一点。我收到错误提示,请求失败,状态代码为400 正如他们在第一个链接中建议的那样,我从后端创建了签名urlReactjs 如何使用react和django rest框架将图像上载到aws s3,reactjs,amazon-web-services,amazon-s3,redux,django-rest-framework,Reactjs,Amazon Web Services,Amazon S3,Redux,Django Rest Framework,我正在尝试使用react和drf将图像上载到aws s3。我正在关注这一点。我收到错误提示,请求失败,状态代码为400 正如他们在第一个链接中建议的那样,我从后端创建了签名url urlpatterns = [ path('api/create-permission/aws-s3/', SignS3Upload.as_view(), name='aws-s3'), ] import os import boto3 import mimetypes s3 = boto3.clie
urlpatterns = [
path('api/create-permission/aws-s3/', SignS3Upload.as_view(), name='aws-s3'),
]
import os
import boto3
import mimetypes
s3 = boto3.client('s3')
class SignS3Upload(APIView):
# authentication_classes = (authentication.SessionAuthentication,)
# permission_classes = [IsAuthenticated, ]
def get(self, request):
s3_bucket = os.environ.get('AWS_STORAGE_BUCKET_NAME')
file_name = request.GET['image_name']
file_type = mimetypes.guess_type(file_name)[0]
presigned_post = s3.generate_presigned_post(
Bucket=s3_bucket,
Key=file_name,
Fields={"acl": "public-read", "Content-Type": file_type},
Conditions=[
{"acl": "public-read"},
{"Content-Type": file_type}
],
ExpiresIn=3600
)
data = {
"signed_url": presigned_post,
'url': 'https://%s.s3.amazonaws.com/%s' % (s3_bucket, file_name)
}
return Response(data)
在前端,我使用React和Redux。这里是我如何从前端发送请求的
export const getSignedRequest = (image) => (dispatch, getState) => {
const image_name = image.name
axios.get('https://my-site.herokuapp.com/api/blog/api/create-permission/aws-s3/', { params: { image_name } })
.then((res) => {
dispatch({
type: GET_PARTICULAR_BLOG_IMG_UPLOAD,
payload: res.data
});
var postData = new FormData();
for (key in res.data.fields) {
postData.append(key, res.data.fields[key]);
}
postData.append('file', image_name);
return axios.post(res.data.url, postData);
})
.then((res) => {
dispatch({
type: GET_PARTICULAR_BLOG_IMG_UPLOAD_AWS,
payload: res.data
});
})
.catch((err) => {
console.log(err)
});
};
我在前端收到了第一个axios请求的响应,如下所示
signed_url: {
url: 'https://my-site.s3.amazonaws.com/',
fields: {
acl: 'public-read',
'Content-Type': 'image/jpeg',
key: 'xxxxxxxxxxx.jpg',
AWSAccessKeyId: 'xxx_access_id_xxxx',
policy: 'xxx_policy_xxx',
signature: 'xxx_signature_xxx'
}
},
url: 'https://my-site.s3.amazonaws.com/xxxxxxxxxxx.jpg'
},
这里是settings.py
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
您可以使用下面的库来上传将
https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html
我只使用它,我已经编辑了我的问题,请看一下。在console.log(err)上,它只显示请求失败,状态代码为400。你能告诉我在哪里可以找到细节错误吗?请接受我的建议,这对编程来说相当陌生:)您可以单击网络,您可以打开响应
InvalidRequest
您提供的授权机制不受支持。请使用AWS4-HMAC-SHA256.908A1A8D2F31C9B9Yg9fQE/MYKFEEC+kAppSWEIVU2WTsZNUGQZFJgXHUwIolndm5fp0SYbcgi7hjk5RUn2/oWDFj0=来自aws s3的its,