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的方法则在特定场景下非常有用。这些方法不仅能够满足基本的文件下载需求,还能应对更复杂的业务场景,为开发者提供了丰富的选择。希望本文的内容对读者在实际项目中实现文件下载功能有所帮助。

发布于 2025-01-14 03:28:06
分享
海报
188
上一篇:JavaScript滚动条属性:scrollTop和scrollHeight详解 下一篇:JavaScript 数组方法:findIndex() 的使用技巧
目录

    忘记密码?

    图形验证码