javas3api:文件在s3浏览器中显示不正确

nr9pn0ug  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(220)

我使用这个s3库将文件存储到s3 bucket中。
代码如下:
文档服务.java

/**
     * Persists document information in Object store
     *
     * @param documentDto document upload data
     * @return id of uploaded document
     * @throws GenericException on error
     */
    @Transactional
    public UUID uploadDocument(DocumentDto documentDto) throws GenericException {
        validationService.validateAndThrowException(documentDto);

        String uuid = randomUUID().toString()
        MultipartFile documentFile = documentDto.getFile();
        String documentRefKey = "SFI_" + currentDate() + "/" + uuid + "/";

        // Store the document in s3 bucket
        s3Client.putObject(createPutDocumentFileRequest(documentFile, documentRefKey));

        return uuid;
    }

    /**
     * Creates put request for object store.
     *
     * @param document document
     * @param documentRefKey document reference key
     * @return put object request
     */
    private PutObjectRequest createPutDocumentFileRequest(MultipartFile document, String documentRefKey) {
        S3ObjectMetadata metadata = new S3ObjectMetadata();
        metadata.addUserMetadata("fileName", document.getFileName());
        metadata.setContentType(document.getFileType());
        PutObjectRequest req = new PutObjectRequest(bucketName, documentRefKey, document.getInputStream());
        req.withObjectMetadata(metadata);

        return req;
    }

然而,如果我看看我的桶,它看起来是这样的:

不知道为什么会这样。

ruarlubt

ruarlubt1#

在你代码的某个地方,可能在 currentDate 方法,除了提供类似 ddMMyyyy ,似乎你包括一个 / 在构造对象时介于日期和uuid之间的字符 documentRefKey s3对象键。它将如下所示:

SFI_11022021/<the generated uuid>

当您将这个对象放入s3 bucket时,aws解释为它应该创建一个“类似文件夹”的结构,按 / 人物:

SFI_11022021
    <the generated uuid>

根据美国焊接学会的文件,例如 s3-dg.pdf 以及 Development/Projects.xls ,其中包括:
控制台使用关键字名称前缀( Development/ , Finance/ ,和 Private/ )和分隔符( '/' )显示文件夹结构。这个 s3-dg.pdf 键没有前缀,因此它的对象直接出现在bucket的根级别。如果你打开门 Development/ 文件夹,你看到了吗 Projects.xlsx 物体在里面。
amazons3支持bucket和objects,没有层次结构。但是,通过在对象键名称中使用前缀和分隔符,amazons3控制台和aws sdk可以推断层次结构并引入文件夹的概念。

q1qsirdb

q1qsirdb2#

我终于自己弄明白了。真正的技巧是将完整的文件名包含在 key .

为了调试这个问题,我查看了通过s3手动上传的文件的所有属性和元信息,并将其与以编程方式上传的文件进行了匹配。从而发现了 key 参考文献。
我很惊讶文档中没有明确提到这一点。以下是固定代码:

/**
     * Persists document information in Object store
     *
     * @param documentDto document upload data
     * @return id of uploaded document
     */
    @Transactional
    public UUID uploadDocument(DocumentDto documentDto) {
        validationHandler.validate(documentDto);

        String uuid = randomUUID().toString()
        MultipartFile documentFile = documentDto.getFile();
        String documentRefPath = "SFI_" + currentDate() + "/" + uuid + "/";

        // Store the converted document in s3 bucket
        s3Client.putObject(createPutDocumentFileRequest(documentFile, documentRefPath));

        return uuid;
    }

    /**
     * Creates put request for object store.
     *
     * @param targetFile document file
     * @param documentRefPath document reference key
     * @return put object request
     */
    private PutObjectRequest createPutDocumentFileRequest(MultipartFile documentFile, String documentRefPath) {
        String fileName = documentFile.getFileName();
        String key = documentRefPath + fileName; // <-- the missing puzzle piece

        S3ObjectMetadata metadata = new S3ObjectMetadata();
        metadata.addUserMetadata("fileName", fileName);
        metadata.setContentType(documentFile.getFileType());
        PutObjectRequest req = new PutObjectRequest(bucketName, key, documentFile);
        req.withObjectMetadata(metadata);

        return req;
    }

相关问题