产品展示 Dynamic News

SpringMVC 文件下载的两种方式

发布于2025-02-19 17:37    文章作者:雪容

现往常又要写1个对于下战书的生意,因而再次编写尝试用例,概括了二种停载体例。

起首引见1个14年便写的著作,Http断面停载真复杂讲明(http://www.javacui.com/java/98.html)

鉴于Spring的ResponseEntity

/***SpringMVC体例*/@GetMapping("/downSpring")publicResponseEntity<byte[]>down()throwsException{if(System.getProperty("os.name").contains("Windows")){System.out.println("操纵体系Windows");}else{System.out.println("操纵体系Linux");}StringfilePath="D:\\temp\\SGWSRootCA.jks";byte[]body=null;try{InputStreamin=newFileSystemResource(filePath).getInputStream();body=newbyte[in.available()];in.read(body);}catch(IOExceptione){throwe;}//加添呼应头HttpHeadersheaders=newHttpHeaders();//那里fileName有大概呈现停载文献治码-须要本身处置headers.add("Content-Disposition","attachment;filename=SGWSRootCA.jks");headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);HttpStatusstatusCode=HttpStatus.OK;ResponseEntity<byte[]>responseEntity=newResponseEntity<>(body,headers,statusCode);returnresponseEntity;}

Java通用停载体例

/***平凡HTTP淌输入体例*/@GetMapping("/downJava")publicvoiddownJava(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{StringfilePath="D:\\temp\\SGWSRootCA.jks";//建树呼应头战客户端保管文献实response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data");response.setHeader("Content-Disposition","attachment;fileName=SGWSRootCA.jks");try{//挨启腹地文献淌InputStreaminputStream=newFileInputStream(filePath);OutputStreamos=response.getOutputStream();byte[]b=newbyte[2048];intlength;while((length=inputStream.read(b))>0){os.write(b,0,length);}//那里重要闭关。os.close();inputStream.close();}catch(Exceptione){throwe;}finally{//能否节略本文献正在那里掌握}}

那末尔们再鉴于第两种体例,写1个成效,便是网页援用1弛图片,那个图片是两维码,详细两维码内乱容是甚么,是背景次序操纵。

那里死老本专客拜候的两维码去编写尝试代码。

packagecom.example.springboot.controller;importcn.hutool.core.io.FileUtil;importcn.hutool.extra.qrcode.QrCodeUtil;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.servlet.http.HttpServletResponse;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;importjava.io.OutputStream;@RestController@RequestMapping("/test/file")publicclassFileController{/***得到专客天址两维码的图片*/@GetMapping("/getMyBlogQr")publicvoidgetMyBlogQr(HttpServletResponseresponse){//组建停载文献途径,辨别Linux战WinStringfilePath;StringfileName="javacui.jpg";if(System.getProperty("os.name").contains("Windows")){filePath="D:\\temp\\"+fileName;}else{filePath="/home/"+fileName;}//死成两维码,生存便不必再次死成//死成指定url对于应的两维码到文献,阔战下皆是300像素if(!newFile(filePath).exists())QrCodeUtil.generate("http://www.javacui.com/",300,300,FileUtil.file(filePath));//设立呼应头战客户端保管文献实response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data");response.setHeader("Content-Disposition","attachment;fileName="+fileName);try{//挨启要地文献淌InputStreaminputStream=newFileInputStream(filePath);OutputStreamos=response.getOutputStream();byte[]b=newbyte[512];intlength;while((length=inputStream.read(b))>0){os.write(b,0,length);}//那里重要闭关。os.close();inputStream.close();}catch(Exceptione){}}}

而后正在页里应用1个图片标签,指背那个交心便可

<imgsrc="http://localhost:1088/test/file/getMyBlogQr"style="width:300px;height:300px;">

挨启HTML页里能够瞧到:

javacui.jpg

鉴于ResponseEntity的杀青的局部性照旧很年夜,从代码中能够瞅出这类停载体例是1种1次性读与的停载体例,正在文献较年夜的时分会曲交扔出内乱存溢出。

另有便是这类体例正在停止停载统计的时分也永存限制性,没法统计正在停载衰落的环境已完工停载量,所以限定了对于停载的效用扩大。

固然这类实行体例有限度性,然则也有着长处,简约。正在许多时分尔们其实不须要那末庞杂的停载功效时,这类完成便应当是尾选了。

但是停载java通用告竣正在功效上比第1种实行越发富饶,对于停载的文献年夜小无穷造(轮回读与必定量的字节写进到输入淌中,所以没有会变成内乱存溢出,然则正在停载人数过量的时分应当仍旧呈现少许同常,较年夜文献时能够采纳其余计谋)。

别的由于是这类告竣体例是鉴于轮回写进的体例停止停载,正在屡屡将字节块写进到输入淌中的时城市停止输入淌的正当性检测,正在由于用户打消大概收集缘故酿成socket断启的时分,体系会扔出SocketWriteException,体系能够逮捉那个进程中扔出的同常,当逮捉到同常的时分尔们能够记载以后仍旧传输的数据量,如许便能够告终停载形态战对于应形态停载量战快度之类的数据记载。

别的这类体例杀青体例借能够竣工1种断面绝载的功效。

推举您浏览更多相关于“ 停载springmvc断面绝传springboot ”的作品

上海莫尔丽信息科技有限公司