一、该问题的重现步骤是什么?
1. 应用层使用配置minio,yaml文件里配置oss properties
2. 应用层controller,单独接口里调用
Oss ossObject = ossService.getOne(new LambdaQueryWrapper<Oss>().eq(Oss::getOssCode, fileREQ.getCode())); //数据库配置的oss对象
MinioTemplate minioTemplate = (MinioTemplate) ossBuilder.template(ossObject.getTenantId(), ossObject.getOssCode()); String prefix = .substring(, .lastIndexOf()); String filepath = prefix + + ; String url = .getPresignedObjectUrl(.getBucketName().toLowerCase(), filepath, * );
3. oss jar包里调用的 bladeOssRule里的 Authutil.getTenantId()是空值。其实AuthUtil的getuser也是null
BladeOssRule OssRule {
Boolean ;
String (String bucketName) {
String prefix = .? AuthUtil.().concat() : ;
prefix + bucketName;
}
String (String originalFilename) {
+ DateUtil.() + + StringUtil.() + + FileUtil.(originalFilename);
}
(Boolean tenantMode) {
.= tenantMode;
}
}二、你期待的结果是什么?实际看到的又是什么?
前端调用过来的借口,contollr里AuthUtil是能个用户相关信息的。
但是架包里的得不了。我希望也能得到
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
bladex boot 4.5.0.release
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
接口怎么调用的,有没有传递token,AuthUtil是需要能获取到request的请求头才能解析的。
接口这样调用,前端,url调用接口定义在api下的js文件里
import request from '@/axios';
export const getPresignedUrl = (data) => {
return request({
url: '/resource/endpoint/get-presigned-url',
method: 'post',
data: data
})
}
vue组件里,这样使用api 接口
async handleFileSubmit(){
try {
const reqData = {}
const res = await getPresignedUrl(reqData);
if (res.data.code === 200 && res.data.data.length > 0) {
this.fileUrls = res.data.data;
}else{
this.$message.error(res.data.message);
}
}
后端接口代码就干一件事情,调用oss
R<List<AttachVO>> (FileREQ fileREQ) {
Oss ossObject = .getOne(LambdaQueryWrapper<Oss>().eq(Oss::getOssCode, fileREQ.getCode()));
MinioTemplate minioTemplate = (MinioTemplate) ossBuilder.template(ossObject.getTenantId(), ossObject.getOssCode());
List<CompletableFuture<AttachVO>> futures = fileREQ.getAttaches().stream().map(attachFile -> CompletableFuture.(() -> {
String prefix = .getOriginalName().substring(, .getOriginalName().lastIndexOf());
String filepath = prefix + + ;
String url = .getPresignedObjectUrl(.getBucketName().toLowerCase(), filepath, * );
(Func.(url)) {
AttachVO vo = AttachVO();
vo.setName(filepath);
vo.setDomainUrl(.getEndpoint());
vo.setOriginalName(.getOriginalName());
vo.setExtension(FileUtil.(.getOriginalName()));
vo.setAttachSize(.getAttachSize());
vo.setLink(url);
vo;
}
;
})).collect(Collectors.());
List<AttachVO> fileVOList = futures.stream().map(CompletableFuture::join).filter(Objects::).toList();
R.(fileVOList);
}你们做内部改造了么?原版没有这个方法

你去测试下用户管理的头像上传,看看AuthUtil能不能获取到数据
get-presigned-url
是我们自己在controller层的方法。
你们的 oss 架包
blade-starter-oss

String (String bucketName, String fileName, Integer expires) {
.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.()
.method(Method.)
.bucket(getBucketName(bucketName))
.object(fileName)
.expiry(expires)
.build()
);
}getPresignedObjectUrl 调用的就是这个方法getBucketName(bucketName)

getBucketName(bucketName)里的AuthUtil没有拿到request里的相关信息
疑问:是不是在builder.templete没有让里面的内容自装配?
OssTemplate (String tenantId, String code) {
Oss oss = getOss(tenantId, code);
OssContext ossContext = OssContext();
ossContext.setOss(oss);
ossContext.setOssProperties();
ossContext.setOssPool();
ossContext.setTemplatePool();
LiteRuleResponse<OssContext> resp = .execute(, tenantId, ossContext);
(resp.isSuccess()) {
OssContext contextBean = resp.getContext();
contextBean.getOssTemplate();
} {
ServiceException();
}
}这是你们blade-starter-oss,OssBuilder.java的内容。
看起来只是创建了一个某个oss templete的Bean,并没有AuthUtil自装配也没有调用Context里的,没有看到Set。
你没有列出你们自定义模块的代码,所以无法判断是什么原因。
你先按照我们要求,用原版源码,在个人中心界面上传一个头像,看看AuthUtil能不能获取到数据。
如果官方原版的可以,你自己写的方法不行,那就得列出来看你们是怎么写的具体代码才知道原因。
没有自定义blade-starter-oss的代码块
应用层controller里,主动调用ossbuilder.template方法,强制转化为miniotemplate,以便调用getpersinedurl这个方法
这个代码已经贴上去给你们了
用的就是你们仓库拉下来的blade-starter-oss 4.5.0.release架包,表现如此。
所以,没有自定义任何oss代码块
后文呢?
扫一扫访问 Blade技术社区 移动端