好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java 文件流的处理方式 文件打包成zip

java 文件流的处理 文件打包成zip

1、下载文件到本地

?

1

2

3

4

5

6

7

8

9

10

11

public void download(HttpServletResponse response){

     String filePath = "" ; //文件路径

     String fileName = "" ; //文件名称

     // 读到流中

     InputStream inStream = new FileInputStream(filePath);

     // 设置输出的格式

     response.reset();

      response.setContentType( "bin" );

      response.addHeader( "Content-Disposition" , "attachment; filename=\"" + fileName + "\"" );

      IOUtils.copy(inStream, response.getOutputStream());

}

2、java后端下载

方式一:

?

1

new URL(fileUrl + item.getcBhFileserver()).openStream()

方法二:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public Boolean addFile(String url, String id, String fileName) {

     RequestCallback requestCallBack = new RequestCallback() {

 

         @Override

         public void doWithRequest(ClientHttpRequest request) throws IOException {

             request.getHeaders().add( "accept" , MediaType.APPLICATION_OCTET_STREAM_VALUE);

         }

     };

 

     ResponseExtractor<Boolean> responseExtractor = new ResponseExtractor<Boolean>() {

         @Override

         public Boolean extractData(ClientHttpResponse response) throws IOException {

             if (response.getStatusCode() == HttpStatus.OK) {

                 //得到文件流

                 InputStream input = response.getBody();

                 return true ;

             }

             return false ;

         }

     };

     return restTemplate.execute(url, HttpMethod.GET, requestCallBack, responseExtractor, id);

}

3、文件打包成zip

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

public void zipFilesAll() throws Exception {

         String zipPath = "" ; //zip包路径

         String zipFileName = "" ; //zip包名称

         File zipFile = new File(zipFileName .toString());

 

         // 创建 FileOutputStream 对象

         FileOutputStream fileOutputStream = null ;

         // 创建 ZipOutputStream

         ZipOutputStream zipOutputStream = null ;

         try {

             //创建文件夹

             zipFile = new File(zipPath );

             FileUtils.forceMkdir(zipFile);

 

             //创建文件

             zipFile = new File(zipFileName .toString());

             if (!zipFile.exists()) {

                 zipFile.createNewFile();

             }

 

             // 实例化 FileOutputStream 对象

             fileOutputStream = new FileOutputStream(zipFileName.toString());

             // 实例化 ZipOutputStream 对象

             zipOutputStream = new ZipOutputStream(fileOutputStream);

             // 创建 ZipEntry 对象

             ZipEntry zipEntry = null ;

             for (CL cl: ClList) {

                 // 实例化 ZipEntry 对象,源文件数组中的当前文件

                 zipEntry = new ZipEntry(tCltjjl.getcClmc() + ".zip" );

                 zipOutputStream.putNextEntry(zipEntry);

                 IOUtils.copy( new FileInputStream(cl.getcPath(), zipOutputStream);

             }

         } catch (Exception e) {

             

         } finally {

              //记得删除文件

         }

     }

后台多文件打包成zip返回流 前台提供按钮一键下载

项目pom文件添加二维码操作,和文件打包的maven支持:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<!--二维码相关 start-->

< dependency >

     < groupId >net.glxn.qrgen</ groupId >

     < artifactId >javase</ artifactId >

     < version >2.0</ version >

</ dependency >

<!--二维码相关 end-->

 

<!--文件打包相关 start-->

< dependency >

     < groupId >org.apache.commons</ groupId >

     < artifactId >commons-compress</ artifactId >

     < version >1.12</ version >

</ dependency >

<!--文件打包相关 end-->

前台代码:

?

1

< button type = "button" onclick = "downloadzip()" >下载</ button >

js(我用了thymeleaf模板)代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<script th:inline= "javascript" >

     function downloadzip(){

 

             var storeType = $( "#storeType" ).val();

             if (storeType == "" ){

                 bootAlertError( "请选择门店!" );

                 return ;

             }

             var url = [[@{/downLoadProductQrCode/getStreamZip}]];

 

             //模拟form表单 返回打包流

             var form = $( '<form method= "POST" action="' + url + '" enctyped="multipart/form-data">' +

                         '<input name= "agencyId" type= "hidden" value="' +storeType+ '" />'

                         + '</form>' );

             form. appendTo( 'body' ). submit(). remove();

         }

</script>

后台代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

/**

      * @Author Ni Klaus

      * @Description //TODO 门店总代生成打包产品二维码zip

      * @Date 上午 10:38 2019/8/20 0020

      * @Param [params,response]

      * @return void

      **/

     @RequestMapping ({ "getStreamZip" })

     @ResponseBody

     public void findList( @RequestParam Map params,HttpServletResponse response) throws Exception {

         String agencyId = (String) params.get( "agencyId" );

         AgencyAccount agencyAccount = agencyAccountService.getAccountByAgencyId(agencyId);

         //这里设置打包后的zip文件名

         String downloadName = agencyAccount.getName()+ ".zip" ;

         try {

             response.setContentType( "multipart/form-data" );

             response.setHeader( "Content-Disposition" , "attachment;fileName=" + new String(downloadName.getBytes(), "ISO8859-1" ));

         } catch (UnsupportedEncodingException e){

             log.error( "----------下载文件名编码时出现错误------" +e.getMessage());

         }

         OutputStream outputStream = response.getOutputStream();

         ZipArchiveOutputStream zous = new ZipArchiveOutputStream(outputStream);

         zous.setUseZip64(Zip64Mode.AsNeeded);

         zous.setEncoding( "utf-8" );

         try {

             //我这里是通过不同产品类型生成不同产品的二维码图片流

             //具体你想生成什么类型的多个文件打包,只需要循环创建ArchiveEntry 然后zous.putArchiveEntry(entry)就可以了

             StoreProductType[] storeProductTypes = StoreProductType.values();

             for (StoreProductType storeProductType : storeProductTypes) {

                 String url = "http://m.xxx.cn/goods/pay/xxx.html?productid=" +storeProductType.getProductId()

                         + "&agencycode=" + agencyId + "&channelid=def&appfrom=sqjk&isstore=1" ;

                 //打包文件里的每个文件的名字

                 String imgName = storeProductType.getDescription()+ ".png" ;

                 ByteArrayOutputStream out = QRCode.from(url).to(ImageType.PNG).withSize( 300 , 300 ).stream();

                 byte [] bytes = out.toByteArray();

                 ArchiveEntry entry = new ZipArchiveEntry(imgName);

                 zous.putArchiveEntry(entry);

                 zous.write(bytes);

                 zous.closeArchiveEntry();

                 if (out != null ) {

                     out.close();

                 }

             }

         } catch (Exception e){

             e.printStackTrace();

             log.error( "---------------门店总代生成二维码打包流出错----------------" +e.getMessage());

         } finally {

             if (outputStream != null ){

                 outputStream.close();

             }

             if (zous != null ){

                 zous.close();

             }

         }

     }

最后效果:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://www.cnblogs.com/jiehanshi/p/11533465.html

查看更多关于java 文件流的处理方式 文件打包成zip的详细内容...

  阅读:20次