业务场景
将华为云OBS桶里的多个文件打包成一个zip,并将生成的这个zip再次上传到华为云OBS桶里。
错误问题
生成的zip下载下来,解压时报错:文件末端错误
错误代码
/**
* @param req 要下载的文件列表
* @param waterMark 水印标记
* @param objectKey 上传到obs的路径
*/
public void downloadZipToPhone(FileRequest req, String waterMark, String objectKey) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(bos);
//从obs下载文件,放到压缩包里
for (com.xxxx.xxxx.entity.File file : req.getFiles()) {
ObsObject obsObject = obsClient.getObject(bucketName, file.getFileObsName());
zipOutputStream.putNextEntry(new ZipEntry(file.getFileRealName()));
InputStream in = obsObject.getObjectContent();
IOUtils.copy(in, zipOutputStream);
zipOutputStream.closeEntry();
in.close();
}
//上传文件到obs
obsClient.putObject(bucketName, objectKey, new ByteArrayInputStream(bos.toByteArray()));
//关闭流...错误点所在位置
zipOutputStream.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
throw new JJException("downloadZipToPhone,失败:" + e.getMessage());
}
}
正确代码
/**
* @param req 要下载的文件列表
* @param waterMark 水印标记
* @param objectKey zip要上传到obs的路径
*/
public void downloadZipToPhone(FileRequest req, String waterMark, String objectKey) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(bos);
//从obs下载文件,放到压缩包里
for (com.xxxx.xxxx.entity.File file : req.getFiles()) {
ObsObject obsObject = obsClient.getObject(bucketName, file.getFileObsName());
zipOutputStream.putNextEntry(new ZipEntry(file.getFileRealName()));
InputStream in = obsObject.getObjectContent();
IOUtils.copy(in, zipOutputStream);
zipOutputStream.closeEntry();
in.close();
}
//关闭流...要在这个地方先关闭zipOutputStream
zipOutputStream.close();
//上传文件到obs
obsClient.putObject(bucketName, objectKey, new ByteArrayInputStream(bos.toByteArray()));
bos.close();
} catch (Exception e) {
e.printStackTrace();
throw new JJException("downloadZipToPhone,失败:" + e.getMessage());
}
}
解析
//要在上传obs之前先关闭zipOutputStream
zipOutputStream.close();
//上传文件到obs
obsClient.putObject(bucketName, objectKey, new ByteArrayInputStream(bos.toByteArray()));
bos.close();
百度到:文件末端错误是因为流的开启,关闭导致的,故而测试调整位置。