JavaWeb实现文件下载及在文件下载时候的一些坑加粗样式****
源码在文章底部
因为IE 谷歌 火狐使用的解码编码方式不同 所以在下载的时候需要分别解析,以下是处理浏览器编码的问题
这里需要和你项目里面真实的文件名称一样,包括后缀名在者就是路径问题
附上源码
import cn.hutool.core.codec.Base64Encoder;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 因为谷歌 IE 火狐使用的解码编码方式不同 还需要分开来进行操作
String ua = req.getHeader("User-Agent");
System.out.println(ua+"___________________");
//USer-Agent 中有对应的浏览器名称
String str = "";
if(!ua.contains("Firefox")){
str = "attachment; fileName="+"=?utf-8?B?"+new Base64Encoder().encode("轻大logo","UTF-8");
System.out.println(str+"11");
}else {
str = "attachment; fileName="+ URLEncoder.encode("轻大logo","UTF-8");
System.out.println(123);
}
//获取要下载的文件名
String downloadName = "logo.jpg";
//读取要下载的文件内容(通过servletContext对象获取)
ServletContext servletContext = getServletContext();
//获取要下载的文件类型
String mimeType = servletContext.getMimeType("/static/img/"+downloadName);
//System.out.println(mimeType);
//告诉客户端返回的数据类型
resp.setContentType(mimeType);
//Content-Disposition表示下载的文件应该如何处理, attachment表示下载 后面表示名字,可以和源文件名字不同,可以自定义
resp.setHeader("Content-Disposition", "attachment; filename=" + downloadName);
InputStream inputStream = servletContext.getResourceAsStream("/static/img/"+downloadName);
//获取需要下载文件的流
OutputStream outputStream = resp.getOutputStream();
//获取一个输出流
//使用jar包中的方法,将获得的输入流,拷贝到输出流中
IOUtils.copy(inputStream,outputStream);
}
}