- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的项目中遇到了一个奇怪的问题,我无法找到我做错了什么。我正在尝试将图像上传到我的博客,并且我正在使用 aws s3 配置来执行此操作。我相信我的配置是正确的,但以防万一我将它们添加到那里:
这里是我的cors配置
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我所有的 IAM 策略和用户 API 都已按顺序激活。这是我后端的代码:
const s3 = new AWS.S3({
accessKeyId: keys.aws.clientID,
secretAccessKey: keys.aws.clientSecret,
signatureVersion: "v4",
region: "eu-west-3"
})
const router = express.Router()
// @route GET api/posts/upload
// @desc Upload an image on amazone server API
// @access Private
router.get(
"/upload",
passport.authenticate("jwt", { session: false }),
(req, res) => {
const key = `${req.user.id}/${uuid()}.jpeg`
s3.getSignedUrl(
"putObject",
{
Bucket: "bebeyogini",
ContentType: "image/jpeg",
Key: key
},
(err, url) => res.send({ key, url })
)
}
)
当我调用/upload 端点时,它返回一个
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
这就是为什么在我的前端(在 redux 中)我添加了一个 PUT,我在标题中添加了内容类型文件。但是在这个项目中还是不行
export const sendPost = (newPost, file, history) => async dispatch => {
dispatch(loading())
const uploadConfig = await axios.get("/api/posts/upload")
console.log(uploadConfig)
console.log(uploadConfig.data)
await axios.put(uploadConfig.data.url, file, {
headers: {
"Content-Type": file.type
}
})
const res = await axios.post("/api/posts", {
...newPost,
imageUrl: uploadConfig.data.key
})
history.push("/dashboard")
dispatch({
type: POSTS_FETCHED,
payload: res.data
})
}
我几个月前在另一个项目中取得了成功,使 aws s3 可以执行这些相同的配置,我在两者之间的唯一区别是成功的是使用 cookie session 设置的,而这个是 jwt-token在标题中。
如果有人有想法......我完全被困住了!这里是存储库
错误状态:
bebeyogini.s3.eu-west-3.amazonaws.com/5bc0eca10743075fecb360f2/8bb4ff60-d8e7-11e8-ad9d-f776f418fd42.jpeg?Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIAMYTIX267RJ5E4A%2F20181026%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20181026T062242Z&X-Amz-Expires=900&X-Amz-Signature=943652af4bea7e8e0e6d0f97503ea997817e7d68e0540c599643d612d71fe693&X-Amz-SignedHeaders=host:1 PUT https://bebeyogini.s3.eu-west-3.amazonaws.com/5bc0eca10743075fecb360f2/8bb4ff60-d8e7-11e8-ad9d-f776f418fd42.jpeg?Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIAMYTIX267RJ5E4A%2F20181026%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20181026T062242Z&X-Amz-Expires=900&X-Amz-Signature=943652af4bea7e8e0e6d0f97503ea997817e7d68e0540c599643d612d71fe693&X-Amz-SignedHeaders=host 400 (Bad Request)
createError.js:17 Uncaught (in promise) Error: Request failed with status code 400
at createError (createError.js:17)
at settle (settle.js:19)
at XMLHttpRequest.handleLoad (xhr.js:78)
最佳答案
好吧,经过几个晚上的痛苦,我确实找到了问题的解决方案。请注意,AWS S3 不接受包含在他的 PUT 请求中的 jwt 不记名 token 。所以你必须在做请求时禁用它。在这里,我可以使用库 axios 在我的前端修复它...
export const sendPost = (values, file, history) => async dispatch => {
dispatch(loading())
const uploadConfig = await axios.get("/api/posts/upload")
delete axios.defaults.headers.common["Authorization"]
await axios.put(uploadConfig.data.url, file, {
headers: {
ContentType: file.type
}
})
const token = localStorage.getItem("jwtToken")
axios.defaults.headers.common["Authorization"] = token
const res = await axios.post("/api/posts", {
...values,
imageUrl: uploadConfig.data.key
})
dispatch({
type: POSTS_FETCHED,
payload: res.data
})
history.push("/dashboard")
}
关于node.js - AWS S3 存储桶 - getSignedUrl PUT 返回 400(错误请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52999712/
我需要获取“bucket/loads/:loadID”路径中所有文件的 URL。我能够在名为"file"的数组中获取这些文件。然后我过滤它(我得到 endFiles 数组)。现在我只需要一个名为 ur
我有存储触发功能,可以调整上传的图像大小并将其替换到存储中,然后更新数据库中的 URL }).then(() => { console.log('Original file d
我正在尝试使用 file.getSignedUrl()通过 Google Cloud Functions (Nodejs) 从 Firebase Storage 获取下载 URL。我在 Cloud F
我正在使用 react-s3-uploader Node 包,它接受一个 signingUrl 来获取用于将对象存储到 S3 中的 signedUrl。 目前我已经配置了一个 lambda 函数(带有
在 localhost 上工作正常,但在服务器上不工作。所有返回的 URL 都已经过期。 AccessDenied Request has expired 2016-04-26T09:44:22Z2
是否可以在 S3 对象的 getSignedUrl 操作上设置 access-control-allow-origin?我一直在寻找 aws 文档中的可用参数列表,但不清楚。 更新:假设我在名为“te
我成功生成了一个签名 url,然后我可以在有限的时间内使用它从我的 s3 存储桶下载资源。但是,我正在尝试在此处记录的参数中使用 ResponseContentDisposition 属性: http
我的 Firebase 存储 getSignedUrl()下载链接工作几天,然后停止工作。错误信息是 SignatureDoesNotMatch The request signature we ca
我对 AWS 比较陌生。我想要做的就是将图像从我的应用程序上传到 aws S3 并下载它以在应用程序的另一个页面中查看图像。上传成功,能够在S3中看到上传的图片。但无法下载它,因为它会抛出以下错误。
我有一些非常简单的代码来生成 S3 URL。我从 SDK 返回的 URL 只有 S3 的基本路径。它不包含任何其他内容。为什么会这样? var AWS = require('aws-sdk'); va
我正在生成一个预签名 URL,以便我可以将文件上传到 S3 存储桶。 var params = {Bucket: 'xxxxxxx', Key: 'key', Expires: 60}; var ur
我的问题是,当我将响应通过管道传输到前端时,Safari(似乎 IOS 上的所有浏览器都一样)不显示视频。但是,这些视频会在所有浏览器的 Android 和 win/linux 桌面上显示。 请注意,
通过过期的 URL 访问 S3 资源时,我试图优雅地处理 403。目前它返回一个 amz xml 错误页面。我上传了一个 403.html 资源,并认为我可以重定向到该资源。 存储桶资源是我的应用程序
我有一个 http onCall 云函数,我想返回一个 signedURL 以允许我将文件上传到云存储桶 Previous question 它一直告诉我权限被拒绝,但我看不出问题出在哪里。函数 GC
在尝试获取 getObject 的签名 URL 时,我从 aws-sdk 库收到以下错误: \node_modules\aws-sdk\lib\util.js:983 return str
这是我与问题相关的云函数代码片段: // Somewhere outside the function import * as nodedt from 'node-datetime' ... // I
这是我与问题相关的云函数代码片段: // Somewhere outside the function import * as nodedt from 'node-datetime' ... // I
我正在尝试创建一个签名 URL 以允许从 AWS S3 存储桶下载文件。对于我的 Node.JS lambda 函数,我向它传递一个文件名,它将创建一个签名 URL,然后我在客户端触发该 URL 以下
我在我的项目中遇到了一个奇怪的问题,我无法找到我做错了什么。我正在尝试将图像上传到我的博客,并且我正在使用 aws s3 配置来执行此操作。我相信我的配置是正确的,但以防万一我将它们添加到那里: 这里
我正在尝试获取一个预签名 URL 以将文件上传到 S3 存储桶。这是我的工作流程: 1。调用 Lambda -> 2.获取预签名 URL -> 3.使用文件命中 URL (PUT) 1。调用 Lamb
我是一名优秀的程序员,十分优秀!