我正在尝试将spring boot 1.5.7迁移到其最新版本的realease 2.0.1。在旧版本中,我使用此语法来恢复文件。
GridFSDBFile gridFsdbFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(fileId)));
你知道在新版本中会怎样做吗?我需要
file.setInputStream(gridFsdbFile.getInputStream());
TY!
答案 0 :(得分:2)
GridFSFile gridFsdbFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFsdbFile.getObjectId());
GridFsResource gridFsResource = new GridFsResource(gridFsdbFile,gridFSDownloadStream );
然后
file.setInputStream(gridFsResource.getInputStream());
你可以在MongoConfiguration中定义gridFSBucket,就像这样
@Bean public GridFSBucket getGridFSBuckets() {
MongoDatabase db = mongoDbFactory().getDb();
return GridFSBuckets.create(db);
}
答案 1 :(得分:0)
将其保持不变的临时解决方案是包含依赖
#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <stdlib.h>
#include <stdio.h>
SEXP processlist(SEXP lst){
int i,j,elLength;
int len = length(lst);
SEXP tmp;
char ***target = malloc(sizeof(char **)*len);
for (i = 0;i < len; i++) {
tmp = VECTOR_ELT(lst,i);
elLength = length(tmp);
target[i] = malloc(sizeof(char *) * elLength);
for (j=0;j<elLength;j++) {
target[i][j] = CHAR(STRING_ELT(tmp,j));
}
}
printf("target[0][0]: %s\n",target[0][0]);
printf("target[1][1]: %s\n",target[1][1]);
printf("target[2][2]: %s\n",target[2][2]);
for (i=0;i<len;i++)
free(target[i]);
free(target);
return R_NilValue;
}
https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb/1.10.11.RELEASE
答案 2 :(得分:0)
似乎自Spring Boot 2.0.x GridFS操作以来一直在寻求资源方法。
鉴于GridFS中有唯一文件名,您可以这样做:
gridFsTemplate.getResource("my-file-name.txt")
可以使用任何仲裁ID代替真实文件名,以确保其在存储文件时的唯一性(例如ObjectId)。
gridFsTemplate.store(inputStream, "5a55f1ea29485119f7a671a7")
2.1.0.M3中还有commit,其中包含通过GridFSFile获取资源的帮助方法,但在引擎盖下它仍使用文件名。
要通过纯ID 获取文件内容,您可以使用以下内容:
GridFSBuckets.create(dbFactory.getDb()).openDownloadStream(gridFsFileId)