我使用这个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;
}
然而,如果我看看我的桶,它看起来是这样的:
不知道为什么会这样。
2条答案
按热度按时间ruarlubt1#
在你代码的某个地方,可能在
currentDate
方法,除了提供类似ddMMyyyy
,似乎你包括一个/
在构造对象时介于日期和uuid之间的字符documentRefKey
s3对象键。它将如下所示:当您将这个对象放入s3 bucket时,aws解释为它应该创建一个“类似文件夹”的结构,按
/
人物:根据美国焊接学会的文件,例如
s3-dg.pdf
以及Development/Projects.xls
,其中包括:控制台使用关键字名称前缀(
Development/
,Finance/
,和Private/
)和分隔符('/'
)显示文件夹结构。这个s3-dg.pdf
键没有前缀,因此它的对象直接出现在bucket的根级别。如果你打开门Development/
文件夹,你看到了吗Projects.xlsx
物体在里面。amazons3支持bucket和objects,没有层次结构。但是,通过在对象键名称中使用前缀和分隔符,amazons3控制台和aws sdk可以推断层次结构并引入文件夹的概念。
q1qsirdb2#
我终于自己弄明白了。真正的技巧是将完整的文件名包含在
key
.为了调试这个问题,我查看了通过s3手动上传的文件的所有属性和元信息,并将其与以编程方式上传的文件进行了匹配。从而发现了
key
参考文献。我很惊讶文档中没有明确提到这一点。以下是固定代码: