当前位置: 首页 > 知识库问答 >
问题:

如何POST文件数据到预先签名的S3 URI与Vue?

季博
2023-03-14

我正在使用Rails后端构建一个Vue应用程序。我正在关注一些在线文章,其中提出了一个工作流程,我:

  1. 让我的Rails API生成一个预签名的S3URL
  2. 我通过Vue应用程序中的API请求获取
  3. 我使用该请求中的数据将实际图像直接发布到S3

前两个步骤工作正常,但是我很难理解如何在请求类型为“多部分/表单数据”的请求中包含文件数据。

我的代码如下,我使用vuetify作为组件库:

<template>
    <v-form>
      <v-file-input v-model="file" label="File input"></v-file-input>
      <v-btn class="mt-2" block bottom color="primary" @click="submit">Opslaan</v-btn>
    </v-form>
</template>

<script>
import { axios_request } from '../_helpers';

export default {
  name:'AccountImageForm',
  data: () => ({
    file: {}
  }),
  methods: {
    filesChange(event) {
      this.file = event.target.files[0]
    },
    submit() {
      axios_request('/api/v1/images/upload_url')
        .then(
          response => {
            // this response contains the pre-signed info
            var data = {
              ...response.url_fields,
              file: this.file
            }
            var headers = { 'Content-Type': 'multipart/form-data' }
            axios_request(response.url, 'POST', data, headers)
              .then(
              response => {
                console.log(response)
              }
            )
          }
        )
    },
  }
}
</script>

此请求失败,出现以下错误

<Error>
  <Code>MalformedPOSTRequest</Code>
  <Message>The body of your POST request is not well-formed multipart/form-data.</Message>
  <RequestId>x</RequestId>
  <HostId>xx</HostId>
</Error>

当我查看原始的formData时,似乎filedata是空的。请求的大小也不够大,所以我的假设是文件丢失了。是否有一些额外的工作来序列化此请求的文件?

谢谢

共有1个答案

家西岭
2023-03-14

问题是您试图发布多部分/表单数据,但发送的是一个JS对象文本,Axios可能只是在串接它。

您需要做的是创建一个FormData实例。

举个例子

response => {
  // convert your url_fields into a FormData instance
  const data = Object.entries(response.url_fields).reduce((fd, [ key, val ]) =>
      (fd.append(key, val), fd), new FormData())

  // now add the file
  data.append('file', this.file)

  axios_request(response.url, 'POST', data)
    .then(...)
}
 类似资料:
  • 问题内容: 我想执行一个预签名的POST以将文件上传到AWSS3存储桶-如何在Go中完成? 请注意,这与通过PUT进行预签名上传不同。 问题答案: 因此,为了帮助他人,我将自己回答问题,并提供一些代码来帮助可能遇到相同问题的其他人。 可在此处找到Google App Engine呈现预签名POST表单的示例网络应用。 和一个小型图书馆,我创建做在Go预签POST。 简而言之,对公共读取的Amazo

  • 找到apk文件签名的最简单方法是什么?请注意,我不是在问代码。我只想从我的电脑上找到它。像这样的签名975yYkKAQF KST7g3ASHvHkYopq=

  • 我正试图通过一个预先签名的URL将一个文件上传到Amazon S3 bucket,这是我从第三个服务获得的。意思是,我没有生成这个URL。我已经阅读了AWS文档,但我不能把它们全部放在一起。这就是我指的。 预选。php 目前,我的代码是这样的。请注意,

  • 我试图使用angular客户端将文件上传到Amazon S3。我已经使用NodeJs应用服务器生成了一个预先签名的URL。在将文件上传到预先签名的URL时,我收到一个错误,如下所示: "对预检请求的响应没有通过权限改造检查:请求的资源上没有'Access-Control-Allow-Origin'标头。因此不允许访问Origin'http://localhost:4200'。" 我已将以下 COR

  • 我有一个从AWS S3预先签署的上传网址上传视频文件。在邮递员上测试视频成功上传。然而,我得到一个403返回时,实施改造。我无法对此任务使用多部分上传。 服务调用: 上传: 我已经确保URL是正确的。内容类型标题也被添加,邮递员截图附后。得到403禁止错误 邮递员截图 我发现了这个相关的问题,但我仍然得到一个403。使用改造2 将文件上传到 AWS S3 预签名 URL 有什么建议吗?