Java实现下载文件的六种方法详解
近期有些网友想要了解Java实现下载文件的六种方法详解的相关情况,小编通过整理给您分析,同时介绍一下有关信息。
在现代Web开发中,文件下载是一个常见的需求。无论是用户上传的文件、系统生成的报告还是从网络获取的数据,都需要一种高效且可靠的方法来实现文件的下载。本文将详细介绍使用Java实现文件下载的六种方法,包括以流的方式下载、下载本地文件、下载网络文件、在线打开文件、将文件转换成Base64以及将MultipartFile转换为File。每种方法都通过示例代码进行了详细说明,旨在为开发者提供全面的参考。
一、以流的方式下载
publicHttpServletResponsedownload(Stringpath,HttpServletResponseresponse){ try{ //path是指欲下载的文件的路径。 Filefile=newFile(path); //取得文件名。 Stringfilename=file.getName(); //取得文件的后缀名。 Stringext=filename.substring(filename.lastIndexOf(".")+1).toUpperCase(); //以流的形式下载文件。 InputStreamfis=newBufferedInputStream(newFileInputStream(path)); byte[]buffer=newbyte[fis.available()]; fis.read(buffer); fis.close(); //清空response response.reset(); //设置response的Header response.addHeader("Content-Disposition","attachment;filename="+newString(filename.getBytes())); response.addHeader("Content-Length",""+file.length()); OutputStreamtoClient=newBufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); }catch(IOExceptionex){ ex.printStackTrace(); } returnresponse; }
二、下载本地文件
publicvoiddownloadLocal(HttpServletResponseresponse)throwsFileNotFoundException{ //下载本地文件 StringfileName="Operator.doc".toString();//文件的默认保存名 //读到流中 InputStreaminStream=newFileInputStream("c:/Operator.doc");//文件的存放路径 //设置输出的格式 response.reset(); response.setContentType("bin"); response.addHeader("Content-Disposition","attachment;filename=\""+fileName+"\""); //循环取出流中的数据 byte[]b=newbyte[100]; intlen; try{ while((len=inStream.read(b))>0) response.getOutputStream().write(b,0,len); inStream.close(); }catch(IOExceptione){ e.printStackTrace(); } }
三、下载网络文件
publicvoiddownloadNet(HttpServletResponseresponse)throwsMalformedURLException{ //下载网络文件 intbytesum=0; intbyteread=0; URLurl=newURL("windine.blogdriver.com/logo.gif"); try{ URLConnectionconn=url.openConnection(); InputStreaminStream=conn.getInputStream(); FileOutputStreamfs=newFileOutputStream("c:/abc.gif"); byte[]buffer=newbyte[1204]; intlength; while((byteread=inStream.read(buffer))!=-1){ bytesum+=byteread; System.out.println(bytesum); fs.write(buffer,0,byteread); } }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } }
publicvoiddownLoadFile(HttpServletResponseresponse,StringhttpUrl){ ServletOutputStreamout=null; try{ //与服务器建立连接 URLurl=newURL(httpUrl); URLConnectionconn=url.openConnection(); InputStreaminputStream=conn.getInputStream(); try{ //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType("multipart/form-data"); }catch(Exceptione){ e.printStackTrace(); } out=response.getOutputStream(); //读取文件流 intlen=0; byte[]buffer=newbyte[1024*10]; while((len=inputStream.read(buffer))!=-1){ out.write(buffer,0,len); } out.flush(); out.close(); inputStream.close(); }catch(Exceptione){ e.printStackTrace(); } }
四、在线打开的方式
publicvoiddownLoad(StringfilePath,HttpServletResponseresponse,booleanisOnLine)throwsException{ Filef=newFile(filePath); if(!f.exists()){ response.sendError(404,"Filenotfound!"); return; } BufferedInputStreambr=newBufferedInputStream(newFileInputStream(f)); byte[]buf=newbyte[1024]; intlen=0; response.reset();//非常重要 if(isOnLine){//在线打开方式 URLu=newURL("file:///"+filePath); response.setContentType(u.openConnection().getContentType()); response.setHeader("Content-Disposition","inline;filename="+f.getName()); //文件名应该编码成UTF-8 }else{//纯下载方式 response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition","attachment;filename="+f.getName()); } OutputStreamout=response.getOutputStream(); while((len=br.read(buf))>0) out.write(buf,0,len); br.close(); out.close(); }
五、将文件转换成base64
/** *将文件转为base64 */ publicstaticStringgetBase64FromFile(Filefile)throwsIOException{ FileInputStreamin=null; ByteArrayOutputStreamout=null; try{ in=newFileInputStream(file); out=newByteArrayOutputStream(); intread=0; byte[]buffer=newbyte[1024]; while((read=in.read(buffer,0,1024))!=-1){ out.write(buffer,0,read); } returnBase64.getEncoder().encodeToString(out.toByteArray()); }catch(IOExceptione){ throwe; }finally{ if(in!=null){ in.close(); } if(out!=null){ out.close(); } } }
六、将MultipartFile转换为File
/** *将MultipartFile转换为File */ publicstaticFileMultipartFileToFile(MultipartFilemultiFile)throwsIOException{ StringfileName=multiFile.getOriginalFilename(); Stringprefix=fileName.substring(fileName.lastIndexOf(".")); InputStreamin=null; OutputStreamout=null; try{ Filefile=File.createTempFile(fileName,prefix); out=newFileOutputStream(file); in=multiFile.getInputStream(); intread=0; byte[]buffer=newbyte[1024]; while((read=in.read(buffer,0,1024))!=-1){ out.write(buffer,0,read); } returnfile; }catch(Exceptione){ throwe; }finally{ if(in!=null){ in.close(); } if(out!=null){ out.close(); } } }
总结
本文详细介绍了Java实现文件下载的六种方法,每种方法都有其特定的应用场景和优势。通过使用InputStream和OutputStream,可以灵活地处理各种文件下载需求。下载本地文件和网络文件的方法适用于不同来源的文件。在线打开文件的功能则提供了更多的灵活性,支持用户直接查看文件内容。将文件转换成Base64编码字符串和将MultipartFile转换为File的方法则在特定场景下非常有用。这些方法不仅能够满足基本的文件下载需求,还能应对更复杂的业务场景,为开发者提供了丰富的选择。希望本文的内容对读者在实际项目中实现文件下载功能有所帮助。
推荐阅读
-
基于PyQt5的HTTP接口测试工具开发实战
-
Java中的URL编码(URLDecoder)与解码(URLEncoder)使用详解
-
Mysql修改root密码的四种方法详解
-
JavaScript中保留两位小数的多种实现方法
-
PHP调用API接口详解:从基础到实践
-
Python中使用PyYAML库来读取、解析和处理YAML文件的方法
近期有些网友想要了解Python中使用PyYAML库来读取、解析和处理YAML文件的方法的相关情况,小编通过整理给您分析,同时介绍...
-
使用Python中的BeautifulSoup (bs4) 解析复杂HTML内容的技巧与示例
-
Microsoft SQL Server 2012 数据库安装图文教程
-
PHP获取本机ip地址实例代码详解
-
C#使用iTextSharp库将图片转换为PDF的步骤及实例代码解析