有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用预先指定的URL限制S3PUT文件大小

我正在生成S3预签名URL,以便客户端(移动应用程序)可以将图像直接放入S3,而不是通过服务。对于我的用例,需要将预签名URL的到期时间配置为更长的窗口(10-20分钟)。因此,我想限制文件上传到S3的大小,以便任何恶意攻击者都无法将大文件上传到S3存储桶。客户端将从可以访问S3存储桶的服务获取URL。我正在使用AWS Java SDK

我发现这可以使用POST表单进行浏览器上传,但如何使用刚刚签名的S3 URL PUT进行上传呢


共 (1) 个答案

  1. # 1 楼答案

    我第一次使用的是S3签名URL,对此我也很担心。 我认为整个签名URL的东西有点痛苦,因为你不能对它们设置最大对象/上传大小限制

    我认为这在文件上传中是非常重要的,只是缺少了

    由于没有这个选项,您不得不处理到期时间等问题。这会变得非常混乱

    但似乎您也可以将S3存储桶用于正常的Post请求,即在其策略中包含内容长度参数的请求。 因此,我可能会在将来与POST路由交换我的签名URL

    我认为,对于适当的、更大的应用来说,这是一条路要走。(?)

    什么可能有助于解决您的问题:

    在JavaScript SDK中有一个方法/函数,它只获取S3对象的元数据(包括文件大小),而不下载整个文件

    它被称为s3。headObject()

    我认为,上传完成后,AWS需要一些时间来处理新上传的文件,然后在您的bucket中可用

    我所做的是,每次上传后我都会设置一个计时器来检查文件大小,如果文件大小大于1mb,它会删除文件。 我想对于制作,你应该把它记录在数据库的某个地方。 我的文件名还包括上传文件的用户id。 这样,如果你想的话,你可以在上传太大后阻止一个帐户

    这在javascript中对我很有用

    function checkS3(key) {
      return new Promise((resolve, reject) => {
        s3.headObject(headParams, (err, metadata) => {
          console.log("setTimeout upload Url");
          if (err && ["NotFound", "Forbidden"].indexOf(err.code) > -1) {
            // console.log(err);
            return reject(err);
            //return resolve();
          } else if (err) {
            const e = Object.assign({}, Errors.SOMETHING_WRONG, { err });
            // console.log(e);
            // console.log(err);
            return reject(e);
          }
          return resolve(metadata);
        });
      });
    }