首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter/Dart上传预签名的多部分压缩到s3添加额外的标题,这将导致zip文件不可压缩。

Flutter/Dart上传预签名的多部分压缩到s3添加额外的标题,这将导致zip文件不可压缩。
EN

Stack Overflow用户
提问于 2021-12-22 09:09:59
回答 1查看 512关注 0票数 2

我正试图用预先签名的url将一个url文件上传到AWS S3。我得到了预先签署的网址,这似乎是很好的邮递员。随着颤振,它也工作,在某种程度上。

但是,问题是,当通过Flutter上传时(我使用了这个片段),它将上传via文件,但是会将额外的184个字节添加到包含以下内容的标题中:

代码语言:javascript
运行
复制
--dart-http-boundary-z86XWhmTq935Bbfwfv.7UA+FIOU5nE4eqfUsZTh6PnGj+HBeAYH
content-type: application/octet-stream
content-disposition: form-data; name="out.zip"; filename="out.zip"

这个标题导致大多数内置解压缩工具无法解压缩文件。

我能够使用osx的内置unzip命令解压缩它,但是当通过Safari下载时,我在下载部分得到了‘解压失败’消息。

在Windows上,即使使用7-Zip,我也没有完全解压缩。

是否有一种方法可以删除标题,这样它就可以上传压缩文件,而不需要添加额外的头文件?

免责声明:从核心上说,我不是一个“颤栗”/“达特德夫”。

谢谢!

编辑1:创建签名的URL (遵循AWS ),我使用以下lambda函数:

代码语言:javascript
运行
复制
'use strict'

const AWS = require('aws-sdk');
AWS.config.update({ region: process.env.AWS_REGION });
const s3 = new AWS.S3();

const URL_EXPIRATION_SECONDS = 300;

exports.handler = async function(event, context, callback) {
  const body = event.body || {};
  return await getUploadURL(JSON.parse(event.body).projectNumber)
}

const getUploadURL = async function(projectNumber) {
  let Key = `${projectNumber}.zip`;
  
  if (!projectNumber) {
    const randomID = parseInt(Math.random() * 10000000)
    Key = `${randomID}.zip`;
  }
  
  // Get signed URL from S3
  const s3Params = {
    Bucket: process.env.UploadBucket,
    Key,
    Expires: URL_EXPIRATION_SECONDS,
    ContentType: 'application/zip',
    // This ACL makes the uploaded object publicly readable. You must also uncomment
    // the extra permission for the Lambda function in the SAM template.
    // ACL: 'public-read'
  }

  console.log('Params: ', s3Params)
  const uploadURL = await s3.getSignedUrlPromise('putObject', s3Params)

  return JSON.stringify({
    uploadURL: uploadURL,
    Key
  })
}
EN

回答 1

Stack Overflow用户

发布于 2021-12-22 15:12:32

我对你片段中的这些行表示怀疑(删除它们):

代码语言:javascript
运行
复制
  request.headers.addAll({
    'Content-Type': mime,
  });

我不认为设置整体请求的内容类型是有帮助的--毕竟,这应该保持为“多部分”。如果要将内容类型提供给其中一个部件,则在添加文件的地方(即在代码段的第49行)。请参阅MultipartRequest的文档。

代码语言:javascript
运行
复制
var request = http.MultipartRequest('POST', uri)
  ..files.add(await http.MultipartFile.fromPath(
      'package', 'build/package.tar.gz',
      contentType: MediaType('application', 'x-tar'))); // content type added here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70446615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档