当使用uploadUrl时,AWS为文件内容添加元数据。

问题描述 投票:0回答:1

我正在使用下面的代码来获取uploadUrl的上传指令。

public UploadInstruction getUploadUrl() {
    final var objectKey = getObjectKey(generateUniqueFileKey());
    final var url = amazonS3.generatePresignedUrl(s3Properties.getBucket(), objectKey,
            calculateExpirationDate(s3Properties.getDownload().getUrlExpiration()), HttpMethod.PUT);
    return new UploadInstruction(url, getFileKey(objectKey));
}

我通过我的api获取URL,然后用Postman发送PUT请求。但是当我使用这个URL上传文件时,我发现AWS在我的文件开头添加了一些元数据,比如 "Content-type: Application octets stream..."。这是一个bug吗?如何避免给上传的文件添加额外的信息与是上传URL?

UPDATED:例如,我想上传简单的txt文件与下一个文本。

test

当我通过uploadUrl上传至S3时,下载后我得到了一个带有下一个内容的文件。

----------------------------174475527638909501568708
Content-Disposition: form-data; name=""; filename="test.txt"
Content-Type: text/plain

test
----------------------------174475527638909501568708--

另外,我在生成uploadUrl的时候更改了文件名。另外,我上传zip压缩包时,从s3 bucket下载后无法解压。但我通过AWS CLI上传文件时,一切正常。

PUT请求中的地址是uploadUrl。接下来是我的头文件,是邮递员添加的。

enter image description here

java amazon-web-services amazon-s3 aws-java-sdk
1个回答
0
投票

亚马逊总是将某些元数据添加到您的S3对象中。它们的完整列表可以被发现 此处. 根据亚马逊 There are two kinds of metadata: system metadata and user-defined metadata. 某些元数据属性,如内容类型会自动添加。

  • 元数据(如对象创建日期)是系统控制的,只有Amazon S3可以修改该值。
  • 其他系统元数据,如为对象配置的存储类以及对象是否启用了服务器端加密,都是系统元数据的例子,其值由您控制。如果您的 bucket 被配置为网站,有时您可能希望将页面请求重定向到另一个页面或外部 URL。在这种情况下,网页是您的 bucket 中的一个对象。Amazon S3 将页面重定向值存储为系统元数据,其值由您控制。

0
投票

我发现了一些信息 此处.通常在上传文件时使用form-data。

var fd = new FormData();
var file = document.getElementById('file')[0];
fd.append('file',file);

有必要使用next。

var upload = document.getElementById('file');
var file = upload.files[0];

完整的代码。

<form method="put" action="" enctype="multipart/form-data" id="myform">

        <div >
            <input type="file" id="file" name="file" />
            <input type="button" class="button" value="Upload" id="but_upload">
        </div>
    </form>

Ajax.在Postman中,有必要使用二进制而不是form-data来附加一个文件:

$(document).ready(function(){

    $("#but_upload").click(function(){

        var upload = document.getElementById('file');
var file = upload.files[0];

        $.ajax({
            url: '<uploadURL>',
            type: 'put',
            data: file,
            contentType: false,
            processData: false,
            success: function(response){
                if(response != 0){
                    alert('file uploaded');
                }else{
                    alert('file not uploaded');
                }
            },
        });
    });
});

在Postman中,需要使用二进制而不是form-data来附加文件。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.