Servlet 下载文件

简介:

项目中使用struts2 下载文件,使用手机浏览器有问题,老是报

Java.lang.IllegalStateExceptionCannot call sendError() after the response has been committed

没办法了,就使用servlet下载apk文件。

servlet类如下:

Java代码   收藏代码
  1. package com.shop.jn.web.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.io.OutputStream;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.commons.lang.StringUtils;  
  13.   
  14. import com.common.util.SystemUtil;  
  15. import com.io.hw.file.util.FileUtils;  
  16.   
  17. /** 
  18.  *  download apk 
  19.  */  
  20. public class DownloadServlet extends HttpServlet {  
  21.     private static final long serialVersionUID = 1L;  
  22.   
  23.     public DownloadServlet() {  
  24.         super();  
  25.     }  
  26.   
  27.     protected void doGet(HttpServletRequest request,  
  28.             HttpServletResponse response) throws ServletException, IOException {  
  29.         OutputStream out = response.getOutputStream();  
  30.         // must be linux path(not \\)  
  31.         String filepath = request.getParameter("filepa");  
  32.         if (StringUtils.isEmpty(filepath)) {  
  33.             filepath = "D:\\eclipse\\workspace\\apkmarket\\upload\\mpc.apk";  
  34.         }  
  35.         File file = new File(filepath);  
  36.         response.addHeader("Content-Disposition""attachment;filename="  
  37.                 + SystemUtil.getFileSimpleName(filepath));  
  38.         response.setContentType("application/octet-stream");  
  39.         byte[] bytes = FileUtils.readBytes4file(file);  
  40.         System.out.println("size:" + bytes.length);  
  41.         response.addHeader("Content-Length""" + bytes.length);  
  42.         out.write(bytes);  
  43.         return;  
  44.     }  
  45.   
  46.     protected void doPost(HttpServletRequest request,  
  47.             HttpServletResponse response) throws ServletException, IOException {  
  48.         doGet(request, response);  
  49.     }  
  50.   
  51. }  

 使用servlet之后,手机浏览器仍然有问题,后来发现是因为路径分隔符的问题。

上述servlet需要一个请求要素,就是文件路径。

手机浏览器中,点击一个超链接就开始下载,超链接形如download.do?filepath=D:\eclipse\workspace\apkmarket\upload\mpc.apk

这时,就会下载失败,经过反复测试、尝试,发现路径分隔符有问题,改为:download.do?filepath=D:/eclipse/workspace/apkmarket/upload/mpc.apk 就好了。

说明:手机是安卓系统。

 

注意:

(1)安卓手机浏览器下载文件时,下载的超链接中文件路径应该使用linux的格式(xxx/xxx/xxx/);

(2)下载servlet中要指定ContentType 为"application/octet-stream"

相关文章
|
7月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
112 0
|
前端开发 应用服务中间件 C++
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
|
6月前
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
|
7月前
|
缓存 前端开发 Java
15:Servlet 3.0文件上传与下载-Java Web
15:Servlet 3.0文件上传与下载-Java Web
191 5
|
JSON 前端开发 JavaScript
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(一)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
Servlet实现下载图片到本地
Servlet实现下载图片到本地
|
Java 应用服务中间件
用IDEA创建servlet文件并用Tomcat运行
用IDEA创建servlet文件并用Tomcat运行
189 0
|
Java
servlet学习总结(二)—图片下载和读取属性文件
servlet学习总结(二)—图片下载和读取属性文件
154 0
servlet学习总结(二)—图片下载和读取属性文件
servlet下载文件例子
servlet下载文件例子
77 0
|
Java 应用服务中间件
无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用
java.lang.Error: 无法解析的编译问题: 无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用了它 无法解析类型 javax.servlet.http.HttpServletResponse。
3697 0