OBS+ZIP压缩遇到的坑:文件末端错误

文章讲述了在使用华为云OBS将多文件打包成ZIP并上传过程中遇到的文件末端错误,错误源于流的关闭顺序不当。作者提供了修复后的正确代码,强调了在上传到OBS之前必须关闭ZipOutputStream以避免错误。
摘要由CSDN通过智能技术生成

OBS+ZIP压缩遇到的坑:文件末端错误

业务场景

将华为云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();

百度到:文件末端错误是因为流的开启,关闭导致的,故而测试调整位置。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
obs+ffplay是一种常用的组合,用于实时流媒体的录制和播放。下面是使用obs和ffplay的介绍和演示: 1. OBS(Open Broadcaster Software)是一款免费且开源的流媒体录制和直播软件。您可以使用OBS来录制您的屏幕、摄像头和音频,并将其直播到各种平台上。 2. FFplay是FFmpeg项目中的一个简单的媒体播放器。它可以播放各种音频和视频格式,并且具有很好的兼容性和性能。 使用OBS和FFplay进行实时流媒体的录制和播放的步骤如下: 1. 首先,确保您已经安装了OBS和FFmpeg。您可以通过以下命令在Linux上安装FFmpeg: ```shell sudo apt install ffmpeg ``` 在macOS上,您可以使用Homebrew安装FFmpeg: ```shell brew install ffmpeg ``` 2. 打开OBS并进行必要的设置,例如选择录制的屏幕或摄像头,设置音频输入等。 3. 在OBS中,您可以选择将录制的内容保存为文件或直播到流媒体平台。如果您选择保存为文件,可以选择输出格式和编码器。 4. 如果您选择直播到流媒体平台,您需要获取流媒体平台提供的流媒体密钥,并在OBS中进行相应的设置。 5. 开始录制或直播后,您可以使用FFplay来播放实时流媒体。在终端中运行以下命令: ```shell ffplay rtmp://your_stream_url ``` 将"your_stream_url"替换为您的实时流媒体URL。 请注意,上述步骤是一般的指导,具体的设置和操作可能因您使用的平台和版本而有所不同。建议您参考OBS和FFmpeg的官方文档以获取更详细的信息和指导。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值