一、该问题的重现步骤是什么?
1. 增加了附件二进制方式
2.
3.
二、你期待的结果是什么?实际看到的又是什么?
为了适配附件分片上传,附件上传增加二进制流的方式,测试发现txt文本上传可以正常打开,jpg文件上传无法正常打开,原始jpg文件是101kb,上传完成之后变成143kb。
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
Bladex联合版, 4.5.0.RELEASE,Linxu系统
四、请提供详细的错误堆栈信息,这很重要。
原始文件:
上传合并成功之后的文件
五、若有更多详细信息,请在下面提供。
/** * 分片信息校验之后开始分片上传文件,接受二进制流 *专用
* @return */ @PostMapping( value="/uploadChunkOctetStream", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE ) public RuploadChunkOctetStream(HttpServletRequest request, @Parameter(description = "文件的唯一标识", required = true) @RequestParam String identifier, @Parameter(description = "分块的序号,从0开始", required = true) @RequestParam Integer index, @Parameter(description = "分块大小,最后一块可能小于该值", required = true) @RequestParam Long chunkSize, @Parameter(description = "文件名,传入的文件名", required = true) @RequestParam String fileName, @Parameter(description = "分块的总数量,依据chunkSize计算", required = true) @RequestParam Integer totalChunks, @Parameter(description = "文件总大小", required = true) @RequestParam Long totalSize) throws IOException{ FileChunkRequest fileChunkRequest = FileChunkRequest.builder() .identifier(identifier) .chunkNumber(index+1) .chunkSize(chunkSize) .filename(fileName) .totalChunks(totalChunks) .currentChunkSize(chunkSize) .totalSize(totalSize) .build(); FileChunkCheckResponse upload = chunkService.upload(fileChunkRequest,request.getInputStream()); return R.data(upload); } public FileChunkCheckResponse upload(FileChunkRequest fileChunkRequest, InputStream inputStream) { String identifier = fileChunkRequest.getIdentifier(); String path = chunkFileProperties.getChunkPath() + File.separator + identifier; // 校验 chunkNumber 合法性 int chunkNumber = fileChunkRequest.getChunkNumber(); int totalChunks = fileChunkRequest.getTotalChunks(); if (chunkNumber < 0 || chunkNumber > totalChunks) { throw new IllegalArgumentException("Invalid chunk number: " + chunkNumber); } boolean exist = FileUtil.exist(path); if (!exist) { // 创建文件夹 FileUtil.mkdir(path); } String chunkFilePath = path + File.separator + chunkNumber; File chunkFile = new File(chunkFilePath); try (OutputStream outputStream = new FileOutputStream(chunkFilePath)) { byte[] buffer = new byte[8192]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } // 保存分片信息 Chunk chunk = getChunk(fileChunkRequest.getIdentifier(), fileChunkRequest.getChunkNumber()); if (Func.isEmpty(chunk)) { chunk = new Chunk(); } chunk.setChunkNumber(fileChunkRequest.getChunkNumber()); chunk.setChunkSize(fileChunkRequest.getChunkSize()); chunk.setCurrentChunkSize(fileChunkRequest.getCurrentChunkSize()); chunk.setFilename(fileChunkRequest.getFilename()); chunk.setIdentifier(fileChunkRequest.getIdentifier()); chunk.setRelativePath(path); chunk.setTotalChunks(fileChunkRequest.getTotalChunks()); chunk.setTotalSize(fileChunkRequest.getTotalSize()); baseMapper.insertOrUpdate(chunk); // 查询所有分块 List chunkList = this.getChunkList(fileChunkRequest.getIdentifier()); List chunkNumberList = chunkList.stream().mapToInt(Chunk::getChunkNumber).boxed().toList(); FileChunkCheckResponse response = FileChunkCheckResponse.builder().uploaded(chunkNumberList).build(); // 是否上传完成 if (chunkNumberList.size() == totalChunks) { response.setNeedMerge(Boolean.TRUE); } // 是否需要添加当前分块 return response; }catch (IOException e) { log.error("Failed to write chunk file: {}", chunkFilePath, e); throw new ServiceException("Failed to write chunk file: " + chunkFilePath); } }
你用一个原生的springboot工程测试下你的这套代码是否能正常上传成功
使用SpringBoot写了个demo程序,是可以的
demo程序也需要实现oss上传才可以,如果demo程序能正常分片上传到oss,并且能正常加载,但是bladex里同样的逻辑不行,则把你的完整demo发到我们邮件:bladejava@qq.com
demo中的代码原封不动拿到bladex框架里面,上传的附件就有问题,现在怀疑是框架层做了什么处理影响了?
demo已发到你们邮箱,不需要上传到oss这一步就出问题了,写入到本地临时文件,文件就比实际要大
框架里会对request做一次缓存方便流随时获取,逻辑在这里:https://center.javablade.com/blade/BladeX-Tool/src/branch/master/blade-core-boot/src/main/java/org/springblade/core/boot/request/BladeRequestFilter.java
你可以通过配置文件,配置特定的接口进行跳过包装:https://center.javablade.com/blade/BladeX-Tool/src/branch/master/blade-core-boot/src/main/java/org/springblade/core/boot/request/RequestProperties.java#L51
配置试试看
可以了
扫一扫访问 Blade技术社区 移动端