java使用流实现浏览器下载docx文件

这篇博客介绍了如何在Java后端通过流处理技术实现docx文件的下载功能。关键在于设置HTTP响应头,通知浏览器以下载方式处理文件,并提供了前端使用jQuery构造HTTP请求的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后端代码如下:需要注意的是头的设置,需要告诉浏览器需要下载文件,以及下载文件名。

在这里我下载的是一个docx文件

 /**
    * 导出
    * @param aFileName
    * @param aFilePath
    */
   public void doExport(String aFileName, String aFilePath,HttpServletRequest request, HttpServletResponse response){
	   BufferedInputStream bis = null;
       BufferedOutputStream bos = null;
       File file = null;
       file = new File(aFilePath);
       try{
	       request.setCharacterEncoding("UTF-8");
	       String agent = request.getHeader("User-Agent").toUpperCase();
	       if ((agent.indexOf("MSIE") > 0) || ((agent.indexOf("RV") != -1) && (agent.indexOf("FIREFOX") == -1)))
	           aFileName = URLEncoder.encode(aFileName, "UTF-8");
	       else {
	    	   aFileName = new String(aFileName.getBytes("UTF-8"), "ISO8859-1");
	       }
	       response.setContentType("application/x-msdownload;");
	       response.setHeader("Content-disposition", "attachment; filename=" + aFileName);
	       response.setHeader("Content-Length", String.valueOf(file.length()));
	       bis = new BufferedInputStream(new FileInputStream(file));
	       bos = new BufferedOutputStream(response.getOutputStream());
	       byte[] buff = new byte[2048];
	       int bytesRead;
	       while (-1 != (bytesRead = bis.read(buff, 0, buff.length)))
	         bos.write(buff, 0, bytesRead);
	       System.out.println("success");
	       bos.flush();
       }catch (Exception e) {
		// TODO: handle exception
    	   System.out.println("导出文件失败!");
       } finally {
           try {
               if (bis != null) {
                 bis.close();
               }
               if (bos != null) {
                 bos.close();
               }
               file.delete();
             } catch (Exception e) {
//               LOGGER.error("导出文件关闭流出错!", e);
             }
           }
   }

需要下载文件的时候就可以调用该方法:

String tempFilePath = "D:/word/tmp/";

String aFileName = "test.docx";

doExport(aFileName, tempFilePath.concat(aFileName),request,response);

request和response最好是从最开始的方法哪里传递过来,在不同package下可能会出错

然后还需要注意的是,在前端必须使用http请求,而不能使用ajax,否则也会出现fiddler中显示浏览器拿到了数据但是浏览器没反应的情况

前端使用jquery构造一个http请求如下:

function gen(id){
		var urlStrl ="你需要提交的url地址";  
	        var inputValue1 = 'xxxx'; 
	        var form = $('<form></form>');       
	        form.attr('style', 'display:none');        
	        form.attr('target', '_blank');      //设置_blank后,下载会在新窗口打开,同时保留原来的窗口   
	        form.attr('method', 'post');       
	        form.attr('action', urlStrl);
	        var input = $('<input type="text" name="XXX" id="param1" />'); // 可以使用input来提交数据             
	        input.attr('value', inputValue1);  //在input中放入需要传入的数据
	        form.append(input);   
	        $(document.body).append(form);  
	        form.submit();    
}


### Java 实现 Docx 文件下载 为了实现Java中完成Docx文件下载操作,可以采用Servlet技术来响应HTTP请求并将指定路径下的Docx文件作为附件返回给客户端浏览器。下面是一份简单的示例代码用于说明此过程[^1]。 ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @WebServlet("/downloadDocx") public class DownloadDocxServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filePath = "C:\\path\\to\\your\\file.docx"; // 设置要下载docx文件路径 File downloadFile = new File(filePath); FileInputStream inStream = new FileInputStream(downloadFile); // 获取MIME类型 String mimeType = getServletContext().getMimeType(filePath); if (mimeType == null) { mimeType = "application/octet-stream"; } // 设置响应头信息 response.setContentType(mimeType); response.setContentLength((int) downloadFile.length()); // 提供默认名称以便保存到本地磁盘上 String headerKey = "Content-Disposition"; String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName()); response.setHeader(headerKey, headerValue); // 输出写入数据至客户端 try (OutputStream outStream = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } } finally { inStream.close(); } } } ``` 这段程序定义了一个名为`DownloadDocxServlet`的类继承自HttpServlet,并重写了doGet方法以处理GET方式发起的下载请求。当接收到匹配URL模式(即/downloadDocx)的访问时,服务器会定位目标Docx文件并通过设置合适的HTTP头部字段告知浏览器准备接收一个待存储于本机硬盘上的二进制对象;接着通过输入/输出机制把实际的数据传输过去。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值