【黑马程序员】Java Web文件下载功能实现

合集下载

Java Web程序设计任务教程第12章 文件上传和下载

Java Web程序设计任务教程第12章 文件上传和下载

②创建Servlet
③创建下载目录及文件 ④启动项目,查看结果
【任务12-2】实现文件下载
案例代码
任务案例
接下来,通过具体代码实现
文件下载,请查看教材【任务 12-2】。
【任务12-3】解决下载中文文件乱码问题
【任务目标】 通过本任务的学习,读者将学会如何解决下载中文文件时的乱码问题。 【实现步骤】 ①修改Servlet类
第十二章 文件上传和下载
• • •
文件上传原理及其相关API 文件下载原理及编码实现 [任务12-3] 下载中文文件乱码问题的处理
• •
[任务12-1] 实现文件上传 [任务12-2] 实现文件下载
学习目标
1
掌握文件下载的实现
掌握
Hale Waihona Puke 3了解如何实现 文件上传及其相关API 和文件下载的原理
熟悉使用
Commons-FileUpload 组件实现文件上传
【任务12-1】实现文件上传
【任务目标】 使用文件上传的相关知识,实现文件的上传功能。 【实现步骤】 ①创建项目,导入JAR包
②创建上传页面
③创建Servlet ④启动项目,查看运行结果
【任务12-1】实现文件上传
案例代码
任务案例
接下来,通过具体代码实现
文件上传,请查看教材【任务 12-1】。
②修改下载页面
③运行项目,查看结果
【任务12-3】解决下载中文文件乱码问题
案例代码
任务案例
接下来,通过具体代码解决
下载中文文件乱码问题,请查看 教材【任务12-3】。
12.4 本章小结
本章主要介绍了文件上传和下载功能的实现。在实现文 件上传时,使用了Apache组织提供的Commons-FileUpload 组件,该组件提供了文件上传的相关接口和类。文件下载

javaweb文件下载和上传

javaweb文件下载和上传

javaweb⽂件下载和上传1. 项⽬搭建1. 新建maven项⽬:javaweb-file,把⾥⾯src⽬录删掉2. 新建两个Module:download,upload,都是maven空项⽬,添加web support3. 导⼊所需jar包(⼿动lib,add as Library或者denpendency)4. 配置Tomcat我的环境:Maven 3.8 + tomcat 92. ⽂件传输原理3. ⽂件上传3.1 上传⽂件调优1. 为保证服务器安全,上传⽂件应该放在外界⽆法直接访问的路径,建议在WEB-INF路径2. 为防⽌⽂件覆盖现象,可以使⽤UID(唯⼀识别的通⽤码),时间戳,保证⽂件名唯⼀3. 限制⽂件上传最⼤值4. 限制上传⽂件类型,⽐如这个⽂件夹只⽤来存储图⽚,那你就不能上传⼀个.mp4的⽂件3.2 ⼯具类ServletFileUpload作⽤:在后端获取⽂件上传的⽂件数据,并将上传⽂件数据的表单中的每个输⼊项都封装为⼀个FileItem对象DiskFileItemFactory使⽤ServletFileUpload解析前端表单传过来的⽂件数据时需要使⽤到⼯作流程ServletFileUpload负责处理上传的⽂件数据,并将表单中每个输⼊项封装成⼀个FileItem对象,在使⽤ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。

所以,我们需要在进⾏解析⼯作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造⽅法或setFileItemFactory()⽅法设置ServletFileUpload对象的fileItemFactory属性。

常⽤⽅法//isFormField⽅法⽤于判断FileItem类对象封装的数据是⼀个普通⽂本表单//还是⼀个⽂件表单,如果是普通表单字段则返回true,否则返回falseboolean isFormField();//即:只要是上传的⽂件,返回的就是false//getFieldName⽅法⽤于返回表单标签name属性的值。

Java中实现文件上传下载的三种解决方案(推荐)

Java中实现文件上传下载的三种解决方案(推荐)

Java中实现⽂件上传下载的三种解决⽅案(推荐)java⽂件上传与⽂件下载是程序开发中⽐较常见的功能,下⾯通过本⽂给⼤家介绍Java中实现⽂件上传下载的三种解决⽅案,具体详情如下所⽰;第⼀点:Java代码实现⽂件上传FormFile file=manform.getFile();String newfileName = null;String newpathname=null;String fileAddre="/numUp";try {InputStream stream = file.getInputStream();// 把⽂件读⼊String filePath = request.getRealPath(fileAddre);//取系统当前路径File file1 = new File(filePath);//添加了⾃动创建⽬录的功能((File) file1).mkdir();newfileName = System.currentTimeMillis()+ file.getFileName().substring(file.getFileName().lastIndexOf('.'));ByteArrayOutputStream baos = new ByteArrayOutputStream();OutputStream bos = new FileOutputStream(filePath + "/"+ newfileName);newpathname=filePath+"/"+newfileName;System.out.println(newpathname);// 建⽴⼀个上传⽂件的输出流System.out.println(filePath+"/"+file.getFileName());int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {bos.write(buffer, 0, bytesRead);// 将⽂件写⼊服务器}bos.close();stream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}第⼆点:Jsp页⾯上实现⽂件上传package com.vogoal.util;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Hashtable;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;public class JspFileUpload {/** request对象 */private HttpServletRequest request = null;/** 上传⽂件的路径 */private String uploadPath = null;/** 每次读取得字节的⼤⼩ */private static int BUFSIZE = 1024 * 8;/** 存储参数的Hashtable */private Hashtable paramHt = new Hasptable();/** 存储上传的⽂件的⽂件名的ArrayList */private ArrayList updFileArr = new ArrayList();/*** 设定request对象。

黑马程序员安卓教程:Javase下实现多线程下载编码

黑马程序员安卓教程:Javase下实现多线程下载编码

Javase下实现多线程下载编码多线程下载各个步骤的逻辑我们都已经讲述过,下面我们通过一个案例来实现多线程下载的具体实现。

由于android对标准的javase完全支持,我们可以先创建一个java项目,在该项目中实现多线程下载的功能,这样做也方便了测试。

1.部署服务端运行tomcat服务器,在tomcat安装路径的ROOT目录下放置下载资源(参考:当前计算机的D:\soft\tomcat\apache-tomcat-7.0.52\webapps\ROOT),如图1-1所示:图1-1所示从图1-1可知该下载资源是QQ6.6.exe。

启动tomcat,在浏览器中访问该下载资源(路径为:http://localhost:8080/QQ6.6.exe),效果如图1-2所示:图1-2所示从图1-2可知该下载资源已经完成部署。

2.编写客户端在eclipse中编写一个Java工程,实现多线程从tomcat下载.exe文件。

(1)创建工程【File】→【new】→【Java Project】命名为:多线程下载(2)使用默认包名,创建一个类MultiDownload,工程目录结构如图1-3所示:图1-3所示(3)在多线程下载类(即MultiDownload.class)中,编写下载方法,具体步骤如下:●等分服务端资源首先,发送http请求,得到服务端的返回数据,该返回数据中包含了多个响应报文头,调用getContentLength方法获取返回数据体的长度。

代码如例1-1:运行程序,控制台打印如图1-4所示信息:图1-4所示从图1-4可知:我们已经获取了下载文件的大小,即58694840字节。

对比tomcat中ROOT下的资源文件可以发现控制台打印出的文件大小和该文件的实际大小一致。

其次,假设将该下载资源等分为3份,每一份对应一个线程来下载,则每一个线程下载的数据长度如图1-5所示:每一个线程下载的长度:58694840/3=19564946.66666对应公式:总数/线程个数(threadcount)=每个区块大小(blocksize)第0个线程下载区段第1个线程下载区段第2个线程下载区段0*blocksize~1*blocksize-11*blocksize~2*blocksize-12*blocksize~3*blocksize-1第n个线程下载区段n*blocksize~(n+1)*blocksize-1最后一个线程m下载区段m*blocksize~文件总长度-1图1-5所示根据图1-5所示的计算公式,我们可以在程序中处理每一个线程下载的数据长度,具体代码如例1-2:运行程序,控制台打印如图1-6信息:图1-6所示创建与下载资源等大的空文创建一个RandomAccessFile的对象,调用该对象的setLength方法指定该文件的长度,具体代码如例1-3:运行程序,在工程目录下可以看到新建的空文件,如图1-7所示:图1-7所示此时,浏览该temp.exe文件,效果如图1-8所示:图1-8所示从图1-8得知:此时该文件没有任何数据,都是空字符。

《黑马程序员-JavaWeb课件》

《黑马程序员-JavaWeb课件》

数据库操作
学习使用JDBC进行数据库操 作,掌握MySQL的基本查询 和更新操作。
实践项目
通过实践项目,你将应用所学知识构建一个完整的JavaWeb应用程序,加深对技术的理解和实践能力。
学习资源
在线文档
课程配套在线文档提供全面的 学习资料和代码示例。
实验环境
提供在线的代码编辑和调试环 境,方便学员进行实践项目。
3 数据库操作
JDBC的使用、MySQL数据库操作
2 MVC架构
Model-View-Controller模式的理解、使用
4 框架应用
使用SSH框架进行Web应用开发
课程内容
JavaWeb基础
学习HTTP协议、Servlet和 JSP的基本原理和使用。
MVC架构
了解MVC架构的概念和优势, 学习使用框架进行开发。
社区支持
加入学习社区,与其他学员交 流,获取支持和帮助。
谁适合参加这门课程
1
初学者
没有编程经验的学员,通过本课程,从零入门JavaWeb开发。
2
Web开发者
已有Web开发经验的学员,希望进一步提升自己的技能,掌握JavaWeb开发。ห้องสมุดไป่ตู้
3
Java爱好者
对Java感兴趣的学员,想要了解和掌握JavaWeb开发技术。
《黑马程序员-JavaWeb 课件》
通过本课件,你将掌握JavaWeb开发的关键技术,为你的职业生涯打下坚实 的基础。
课程概述
本课程旨在教授JavaWeb开发的核心概念和技术,包括Servlet、JSP、MVC架构等,帮助学员构建动态而强 大的Web应用程序。
学习目标
1 掌握JavaWeb基础知识 2 理解MVC架构

JavaWeb实现文件上传下载功能实例详解

JavaWeb实现文件上传下载功能实例详解

JavaWeb实现⽂件上传下载功能实例详解在Web应⽤系统开发中,⽂件上传和下载功能是⾮常常⽤的功能,今天来讲⼀下JavaWeb中的⽂件上传和下载功能的实现。

⽂件上传概述1、⽂件上传的作⽤例如⽹络硬盘!就是⽤来上传下载⽂件的。

在智联招聘上填写⼀个完整的简历还需要上传照⽚呢。

2、⽂件上传对页⾯的要求上传⽂件的要求⽐较多,需要记⼀下:必须使⽤表单,⽽不能是超链接表单的method必须是POST,⽽不能是GET表单的enctype必须是multipart/form-data在表单中添加file表单字段,即<input type=”file” name=”xxx”/><form action="${pageContext.request.contextPath }/FileUploadServlet"method="post" enctype="multipart/form-data">⽤户名:<input type="text" name="username"/><br/>⽂件1:<input type="file" name="file1"/><br/>⽂件2:<input type="file" name="file2"/><br/><input type="submit" value="提交"/></form>3、⽐对⽂件上传表单和普通⽂本表单的区别通过httpWatch查看“⽂件上传表单”和“普通⽂本表单”的区别。

⽂件上传表单的enctype=”multipart/form-data”,表⽰多部件表单数据;普通⽂本表单可以不设置enctype属性:当method=”post”时,enctype的默认值为application/x-www-form-urlencoded,表⽰使⽤url编码正⽂当method=”get”时,enctype的默认值为null,没有正⽂,所以就不需要enctype了对普通⽂本表单的测试:<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post">⽤户名:<input type="text" name="username"/><br/>⽂件1:<input type="file" name="file1"/><br/>⽂件2:<input type="file" name="file2"/><br/><input type="submit" value="提交"/></form>通过httpWatch测试,查看表单的请求数据正⽂,我们发现请求中只有⽂件名称,⽽没有⽂件内容。

javaweb简单的实现文件下载及预览

javaweb简单的实现文件下载及预览

javaweb简单的实现⽂件下载及预览@ResponseBody@RequestMapping(value="/downloadFile")public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception{//解决乱码问题String path = request.getParameter("path");String fileName = request.getParameter("fileName");path = MyUtils.isRandomCode(path);fileName = MyUtils.isRandomCode(fileName);try {String filePath = path+fileName;//⾼速浏览器以附件形式下载//不同浏览器的编码不同,对中⽂进⾏编码,下载时输出名称是⽂件名response.setHeader("Content-Disposition","attachment;filename="+fileName);//获取⽂件的mimetype,如123.txt,他的mimetype就是 txt ,下载时,就以 txt 格式下载String mimeType = fileName.substring(stIndexOf(".") + 1); //获取⽂件后缀,⽐如是 txt ⽂件,就是以txt格式下载//设置响应的 mimetyperesponse.setContentType(mimeType);//获取response 输出流,⽤来输出⽂件ServletOutputStream out = response.getOutputStream();//接下来进⾏读取,以输⼊流的形式读取FileInputStream in = new FileInputStream(filePath);byte[] buffer = new byte[1024];int len = 0;while ((len=in.read(buffer))!=-1){out.write(buffer,0,len);}in.close();} catch (Exception e) {System.out.println("下载错误!");}}这⾥有⼀个⼯具类,就是前端传过来的参数有可能会乱码,所以要判断⼀下是否乱码,有乱码的话就处理⼀下package com.zhouhe.modules.api.util;import java.io.UnsupportedEncodingException;/*** ⾃定义⼯具类* @Author zhouhe* @Date 2019/11/15 11:54*/public class MyUtils {/*** 判断是否是乱码,乱码的话进⾏处理,不乱码直接返回* @param code* @return*/public static String isRandomCode(String code) throws UnsupportedEncodingException {if (!XUtil.isEmpty(code)) {//判断是乱码 (GBK包含全部中⽂字符;UTF-8则包含全世界所有国家需要⽤到的字符。

Java实现简单文件下载

Java实现简单文件下载

java实现简单的文件下载文件下载需要在WebRoot 下创建images文件夹并且放入test.txt文件创建jsp文件夹放入01.jspindex.jsp 不变web.xml需要配置servlet 适合初学者研究学习//index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>My JSP 'index.jsp' starting page [下载]//jsp文件夹下的01.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>下载:test1.txt ${errorResult}//文件下载serlvetpackage com.kero99.ygc.download;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DownloadServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//获取文件下载路径String path = getServletContext().getRealPath("/") + "images/";String filename = req.getParameter("filename");File file = new File(path + filename);if(file.exists()){//设置相应类型application/octet-streamresp.setContentType("application/x-msdownload");//设置头信息Content-Disposition为属性名附件形式打开下载文件指定名称为设定的filenameresp.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");//输入流写入输出流InputStream inputStream = new FileInputStream(file);ServletOutputStream ouputStream = resp.getOutputStream();byte b[] = new byte[1024];int n ;//循环读取!=-1读取完毕while((n = inputStream.read(b)) != -1){//写入到输出流从0读取到nouputStream.write(b,0,n);}//关闭流、释放资源ouputStream.close();inputStream.close();}else{req.setAttribute("errorResult", "文件不存在下载失败!");RequestDispatcher dispatcher = req.getRequestDispatcher("https:///qq_17025903/article/details/jsp/01.jsp");dispatcher.forward(req, resp);}}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req,resp);}}//web.xml<!--?xml version="1.0" encoding="UTF-8"?--><web-app id="WebApp_ID" version="2.5" xmlns="https:///xml/ns/javaee" xmlns:web="https:///xml/ns/javaee/web-app_2_5.xsd"xmlns:xsi="https:///2001/XMLSchema-instance"xsi:schemalocation="https:///xml/ns/javaeehttps:///xml/ns/javaee/web-app_2_5.xsd"><display-name>20170428_V1.0_download</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>DownloadServlet</servlet-name><servlet-class>com.kero99.ygc.download.DownloadServlet</servlet-class></servlet><servlet-mapping><servlet-name>DownloadServlet</servlet-name><url-pattern>/downloadServlet.do</url-pattern></servlet-mapping></web-app>。

java代码实现文件的下载功能

java代码实现文件的下载功能

java代码实现⽂件的下载功能昨天,根据需求⽂档的要求,⾃⼰要做⼀个关于⽂件下载的功能,从学校毕业已经很久了,⾃⼰好长时间都没有做过这个了,于是⾃⼰上⽹百度,最终开发出来的代码如下:哦!对了,我先说⼀下我的思路,⾸先需要获取服务器上⽂件存储的路径,然后将⽂件下载到本地。

⾃⼰是先查询表中的⽂件的路径。

LPEdorAnnex表:(这是⾃⼰⽤到的表-其中⽤到的字段是AnnexParth)下⾯是⾃⼰的代码,⾃⼰写在了jsp页⾯中,因为如果写在java类中,不知怎么搞的不太好实现,当然最主要的原因是因为⾃⼰实⼒不⾏,也因为当时⾃⼰赶时间,没有那么多的事件仔细研究,如果以后有时间的话,⾃⼰⼀定要下来好好看看。

1 <%--2 Created by IntelliJ IDEA.3 User: Blame4 Date: 2019/8/295 Time: 10:496 To change this template use File | Settings | File Templates.7 function:问题件下发8 --%>9 <%10//程序名称:11// 程序功能:保全-问题件下发12//创建⽇期:2019/09/0913//创建⼈:14//更新记录:更新⼈更新⽇期更新原因/内容15 %>16 <%@ page import="com.sinosoft.utility.TransferData" %>17 <%@ page import="com.sinosoft.utility.VData" %>18 <%@ page import="com.sinosoft.service.BusinessDelegate" %>19 <%@ page import="com.sinosoft.lis.schema.LPPolicyHolderSchema" %>20 <%@ page import="com.sinosoft.lis.mgubq.PEdorTypeACUI" %>21 <%@ page import="com.sinosoft.utility.CErrors" %>22 <%@ page import="org.apache.log4j.Logger" %>23 <%@ page import="com.sinosoft.lis.mgubq.BQQuestionFileIssueUI" %>24 <%@ page import="java.io.*" %>25 <%@ page import="org.apache.jasper.JasperException" %>26 <%@page contentType="text/html;charset=utf-8" %>27 <%@include file="../common/jsp/UsrCheck.jsp" %>28 <%29//输出参数30 CErrors tError = null;31 String FlagStr = "Fail";32 String Content = "";33 GlobalInput tGI = new GlobalInput();34 tGI = (GlobalInput) session.getAttribute("GI");35 TransferData tTransferData=new TransferData();3637//页⾯有效性判断38if (tGI == null) {39 FlagStr = "Fail";40 Content = "页⾯失效,请重新登陆";41 Logger.getLogger("BQQuestionFileIssueSave").info("页⾯失效,请重新登陆");42 } else {43// 保存登陆管理员账号44 String Operator = tGI.Operator;45// fmtransact 操作符46//获取前台数据47 String tOperate = request.getParameter("fmtransact");48//获取页⾯录⼊的信息49 tTransferData.setNameAndValue("OtherNo", request.getParameter("OtherNo"));//保单号 √50 tTransferData.setNameAndValue("QuestionType", request.getParameter("QuestionType"));//问题件类型 √51 tTransferData.setNameAndValue("QuestionAttribute", request.getParameter("QuestionAttribute"));//问题件属性 √52 tTransferData.setNameAndValue("QuestionReasion", request.getParameter("QuestionReason"));//问题件原因 √53 tTransferData.setNameAndValue("QuestionSendEmail", request.getParameter("sendemail"));//下发邮箱 √54 tTransferData.setNameAndValue("QuestionDes", request.getParameter("QuestionDes"));//问题件描述 √5556 tTransferData.setNameAndValue("QuestionID", request.getParameter("QuestionID"));57 tTransferData.setNameAndValue("sendnode", request.getParameter("sendnode"));58 tTransferData.setNameAndValue("sender", request.getParameter("sender"));59 tTransferData.setNameAndValue("senddate", request.getParameter("senddate"));60 tTransferData.setNameAndValue("replier", request.getParameter("replier"));61 tTransferData.setNameAndValue("replycontent", request.getParameter("replycontent"));62 tTransferData.setNameAndValue("replydate", request.getParameter("replydate"));63 tTransferData.setNameAndValue("state", request.getParameter("state"));64 tTransferData.setNameAndValue("FilePath", request.getParameter("FilePath"));//问题件附件下载路径6566 tTransferData.setNameAndValue("Operator",tOperate);67//问题件附件下载68if("downloadQuestion".equals(tOperate)){69try{70 String filePath=request.getParameter("FilePath");7172//将⽂件上传⾄影响服务器,先获取影响服务器配置路径 by zhuting73 String tpath="";74 String tfilename="";75 String sql="";767778boolean tFileExists=true;79 System.out.println("要下载的⽂件名:"+filePath);80 File file = new File(filePath);81if(!file.exists()){82 tFileExists=false;83 }84if(tFileExists) {85 InputStream fi = new FileInputStream(file);86//BufferedOutputStream处理txt格式时多出2⾏空⾏87 response.reset();88 response.setContentType("application/x-download");89 response.addHeader("Content-Disposition", "attachment;filename=" + file.getName());9091 OutputStream outOS = response.getOutputStream();92 BufferedOutputStream bos = new BufferedOutputStream(outOS);9394int start;95byte[] bt = new byte[4096];96while ((start = fi.read(bt)) != -1) {97 bos.write(bt, 0, start);98 }99100 bos.flush();101 fi.close();102 bos.close();103 outOS.close();104 out.clear(); //清空缓存的内容105 out=pageContext.pushBody(); //更新PageContext的out属性的内容106107108109 }110 }catch (Exception e){111112 }113114 }115//调⽤UI类116try {117//准备传输数据VData118 VData tVData = new VData();119 tVData.add(tTransferData);120 tVData.add(tGI);121 BusinessDelegate tBusinessDelegate = BusinessDelegate.getBusinessDelegate();122//这样写暂时调⽤不到UI类,所以先采⽤直接调⽤UI类的做法123// if (!tBusinessDelegate.submitData(tVData, tOperate, "PEdorTypeACUI")) {124 BQQuestionFileIssueUI tBQQuestionFileIssueUI = new BQQuestionFileIssueUI();125if (!tBQQuestionFileIssueUI.submitData(tVData, tOperate)) {126 Content = "数据保存失败,原因是:" + tBQQuestionFileIssueUI.getErrors().getError(0).errorMessage; 127 FlagStr = "Fail";128 } else {129 FlagStr = "Success";130 Content = "处理成功!";131 }132 } catch (Exception ex) {133 ex.printStackTrace();134 Content = FlagStr + "处理异常,请联系系统运维⼈员!";135 FlagStr = "Fail";136 }137138 }139140 %>141 <html>142 <script type="text/JavaScript">143try {144 parent.fraInterface.afterSubmit('<%=FlagStr%>', '<%=Content%>');145 }146catch (ex) {147 <%--alert('<%=tContent%>');--%>148 }149 </script>150 </html>注意:如果不加下⾯这两⾏代码的话out.clear(); //清空缓存的内容out=pageContext.pushBody(); //更新PageContext的out属性的内容会报getOutputStream() has already been called for this response异常,挺烦⼈的,但是奇怪的是:⽂件居然能下载,但是最后就是会在控制台报这种错误,⾃⼰百度说是tomcat版本的问题,⽤linux系统就不会存在这种问题,当然有问题总会是有解决的办法的。

JavaWeb文件上传与下载功能解析

JavaWeb文件上传与下载功能解析

JavaWeb⽂件上传与下载功能解析在开发过程中⽂件的上传下载很常⽤。

这⾥简单的总结⼀下:1.⽂件上传必须满⾜的条件:a、页⾯表单的method必须是post 因为get传送的数据太⼩了b、页⾯表单的enctype必须是multipart/form-data类型的c、表单中提供上传输⼊域代码细节:客户端表单中:<form enctype="multipart/form-data"/>(如果没有这个属性,则服务端读取的⽂件路径会因为浏览器的不同⽽不同)服务端ServletInputStream is=request.getInputStream();⽤流的⽅式获取请求正⽂内容,进⼀步的解析。

2.上传⽂件的细节:(1)为什么设置表单类型为:multipart/form-data.是设置这个表单传递的不是key=value值。

传递的是字节码.表单与请求的对应关系:如上可以看出在设置表单类型为:multipart/form-data之后,在HTTP请求体中将你选择的⽂件初始化为⼆进制,如上图中的Cookie之下的⼀串的随机字符串下的内容。

但注意,在标识⽂件(即⼀串随机字符串)所分割出来的⽂件字节码中有两⾏特殊字符,即第⼀⾏内容⽂件头和⼀⾏空⾏。

之后的第三⾏才是⼆进制的⽂件内容。

所以在服务端接受客户端上传的⽂件时,获取HTTP请求参数中的⽂件⼆进制时,要去掉前三⾏。

3.⾃⼰⼿⼯解析上传的txt⽂件:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** 如果⼀个表单的类型是post且enctype为multipart/form-date* 则所有数据都是以⼆进制的⽅式向服务器上传递。

JavaWeb实现多个文件压缩下载功能

JavaWeb实现多个文件压缩下载功能

JavaWeb实现多个⽂件压缩下载功能⽂件下载时,我们可能需要⼀次下载多个⽂件。

批量下载⽂件时,需要将多个⽂件打包为zip,然后再下载。

实现思路有两种:⼀是将所有⽂件先打包压缩为⼀个⽂件,然后下载这个压缩包,⼆是⼀边压缩⼀边下载,将多个⽂件逐⼀写⼊到压缩⽂件中。

我这⾥实现了边压缩边下载。

下载样式:点击下载按钮,会弹出下载框:下载后就有⼀个包含刚刚选中的两个⽂件:代码实现:FileBeanpublic class FileBean implements Serializable {private Integer fileId;// 主键private String filePath;// ⽂件保存路径private String fileName;// ⽂件保存名称public FileBean() {}public Integer getFileId() {return fileId;}public void setFileId(Integer fileId) {this.fileId = fileId;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}}控制层:@RequestMapping(value = "/download", method = RequestMethod.GET)public String download(String id, HttpServletRequest request,HttpServletResponse response) throws IOException {String str = "";if (id != null && id.length() != 0) {int index = id.indexOf("=");str = id.substring(index + 1);String[] ids = str.split(",");ArrayList<FileBean> fileList = new ArrayList<FileBean>();for (int i = 0; i < ids.length; i++) {// 根据id查找genericFileUpload,得到⽂件路径以及⽂件名 GenericFileUpload genericFileUpload = new GenericFileUpload();genericFileUpload = genericFileUploadService.find(Long.parseLong(ids[i]));FileBean file = new FileBean();file.setFileName(genericFileUpload.getFileName());file.setFilePath(genericFileUpload.getFilePath());fileList.add(file);}//设置压缩包的名字//解决不同浏览器压缩包名字含有中⽂时乱码的问题String zipName = "download.zip";response.setContentType("APPLICATION/OCTET-STREAM");response.setHeader("Content-Disposition", "attachment; filename="+ zipName);//设置压缩流:直接写⼊response,实现边压缩边下载ZipOutputStream zipos =null;try{zipos=new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())); zipos.setMethod(ZipOutputStream.DEFLATED);//设置压缩⽅法}catch(Exception e){e.printStackTrace();}DataOutputStream os=null;//循环将⽂件写⼊压缩流for(int i=0;i<fileList.size();i++){String filePath=fileList.get(i).getFilePath();String fileName=fileList.get(i).getFileName();File file=new File(filePath+"/"+fileName);//要下载⽂件的路径try{//添加ZipEntry,并ZipEntry中写⼊⽂件流//这⾥,加上i是防⽌要下载的⽂件有重名的导致下载失败zipos.putNextEntry(new ZipEntry(i+fileName));os=new DataOutputStream(zipos);InputStream is=new FileInputStream(file);byte[] b = new byte[100];int length = 0;while((length = is.read(b))!= -1){os.write(b, 0, length);}is.close();zipos.closeEntry();}catch(Exception e){e.printStackTrace();}}//关闭流try {os.flush();os.close();zipos.close();} catch (IOException e) {e.printStackTrace();}}return "redirect:list.jhtml";}总结以上所述是⼩编给⼤家介绍的JavaWeb 实现多个⽂件压缩下载功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

java-web-文件下载三种方式

java-web-文件下载三种方式

一、静态下载静态下载可以理解为对静态资源的下载,静态资源是已经存在于web应用程序的目录或者其子目录中的文件等,不需要通过程序控制进行改变的,可以直接通过浏览器直接进行访问既可以直接下载的使用HTML标签<a>来实现静态下载,如下直接请求应用程序目录下的文件:[html]view plain copy1.<body>2.<a href="abc.txt">静态文件下载</a>3.</body>注意如果直接点击的话并不会下载文件而是在浏览器中显示文件的内容,看它的响应头如下:可以看出content-type是text/plain,这是这个首部决定浏览怎样呈现服务器返回的数据,但是可以通过另存为来完成文件的下载。

因为是一个静态文件,我们没办法编程改变它的返回的content-type的值,这些都是servlet容器来决定的,类似如果是png图片则返回的类型是image/png。

二、动态下载并不是左右的资源都是静态资源,有的文件或者图片可能并不保存在应用程序目录下,而可能是在WEB-INF目录中,抑或是在服务器的其他目录中,还可以是在数据库中,另外也可以通过程序控制生成文件。

1、JSP页面下载要下载的页面如下:[html]view plain copy1.<%@page import="java.util.Date"%>2.<%@ page language="java"contentType="text/html; charset=ISO-8859-1"3.pageEncoding="ISO-8859-1"%>4.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd">5.<html>6.<head>7.<meta http-equiv="Content-Type"content="text/html;charset=ISO-8859-1">8.<title>JSP File</title>9.</head>10.<body>11.<%12. response.setContentType("application/x-msdownload");13. %>14.15. Now is <%=new Date(System.currentTimeMillis())%>16.</body>17.</html>还是使用如下HTML标签:[html]view plain copy1.<a href="content.jsp">JSP下载</a>此时在点击该链接就会弹出save as对话框(在chrome下面测试),但是如果你使用微软的Microsoft Edge浏览器的话则会直接显示该页面内容(Edge另存为也会下载文件)。

Java框架中的文件上传下载

Java框架中的文件上传下载

Java框架中的文件上传下载文件上传和下载是Web开发中常见的功能之一。

在Java框架中,我们可以利用各种技术和工具来实现文件的上传和下载操作。

本文将介绍一些常用的Java框架以及它们提供的文件上传和下载功能。

一、Servlet APIServlet是Java Web开发的基础。

在Servlet API中,提供了上传和下载文件的相关类和方法。

1. 文件上传:对于文件上传,可以使用ServletRequest对象的getPart()方法或者getParts()方法来获取上传的文件。

然后可以通过Part对象的getSize()、getContentType()等方法获取文件的大小、类型等信息,并通过Part对象的write()方法将文件保存到指定路径。

2. 文件下载:对于文件下载,可以通过HttpServletResponse对象的setContentType()方法设置下载文件的MIME类型,通过setHeader()方法设置Content-Disposition头部信息,然后使用OutputStream将文件内容写入response.getOutputStream()。

二、Apache Commons FileUploadApache Commons FileUpload是一个常用的文件上传组件,它提供了更方便的文件上传功能。

1. 文件上传:使用Apache Commons FileUpload,可以通过DiskFileItemFactory和ServletFileUpload来处理文件上传。

DiskFileItemFactory用于创建FileItem对象,ServletFileUpload用于解析请求并返回FileItem对象的列表。

通过遍历FileItem对象列表,可以获取文件的相关信息,并将文件保存到指定路径。

2. 文件下载:对于文件下载,Apache Commons FileUpload只提供了文件上传的功能,并没有提供文件下载的相关方法。

JavaWeb实现使用浏览器从服务器下载文件(后台)

JavaWeb实现使用浏览器从服务器下载文件(后台)

JavaWeb实现使⽤浏览器从服务器下载⽂件(后台)Java Web实现使⽤浏览器从服务器下载⽂件。

下⾯实现两种情况的下载,需求如下:需求(⼀):1、⽤户在页⾯填写表单。

2、填写完成后,选择下载,将表单内容发往后台。

3、后台根据内容⽣产⼀个⽂件,发送给前端。

4、前端成功下载⽂件到本地。

此需求简单来说就是,⽤户在页⾯上填写内容,然后将内容转变成⽂件的形式。

后台设计思路:1、⾸先拿到前端发送过来的内容。

2、将内容解析,存放⾄缓冲区。

3、设置响应头。

4、将缓冲区⾥的内容,以流的⽅式写出。

代码实现:public void download(HttpServletResponse response){JSONObject json = new JSONObject();/* 假设这是前端使⽤JSON放过来的数据 */json.put("A","1");json.put("B","2");json.put("C","3");/* 遍历JSON,将JSON的值放⾄缓冲区 */StringBuilder sb = new StringBuilder();Iterator it = json.keys();while(it.hasNext()){String key = (String)it.next();String value = (String)json.get(key);sb.append(key).append("=").append(value).append("\n");}/* 设置⽂件ContentType类型,这样设置,会⾃动判断下载⽂件类型 */response.setContentType("application/multipart/form-data");/* 设置⽂件头:最后⼀个参数是设置下载⽂件名(假如我们叫a.ini) */response.setHeader("Content-Disposition", "attachment;filename=a.ini");try{/* ⽤流将数据写给前端 */OutputStream os = response.getOutputStream();os.write(sb.toString().getBytes());os.flush();os.close();}catch (IOException ioe){ioe.printStackTrace();}}需求(⼆):1、⽤户指定下载什么⽂件。

JAVAWEB项目大文件上传下载解决方案

JAVAWEB项目大文件上传下载解决方案

JAVAWEB项⽬⼤⽂件上传下载解决⽅案javaweb上传⽂件上传⽂件的jsp中的部分上传⽂件同样可以使⽤form表单向后端发请求,也可以使⽤ ajax向后端发请求1.通过form表单向后端发送请求<form id="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="post" enctype="multipart/form-data"> <div class="bbxx wrap"><inputtype="text" id="side-profile-name" name="username" class="form-control"><inputtype="file" id="example-file-input" name="avatar"><button type="submit" class="btn btn-effect-ripple btn-primary">Save</button></div></form>改进后的代码不需要form标签,直接由控件来实现。

开发⼈员只需要关注业务逻辑即可。

JS中已经帮我们封闭好了this.post_file = function (){$.each(this.ui.btn, function (i, n) { n.hide();});this.ui.btn.stop.show();this.State = this.Config.state.Posting;//this.app.postFile({ id: this.fileSvr.id, pathLoc: this.fileSvr.pathLoc, pathSvr:this.fileSvr.pathSvr,lenSvr: this.fileSvr.lenSvr, fields: this.fields });};通过监控⼯具可以看到控件提交的数据,⾮常的清晰,调试也⾮常的简单。

javaweb文件上传与下载

javaweb文件上传与下载

javaweb文件上传与下载java web 文件上传与下载实现WEB开发中的文件上传功能,需完成如下二步操作:一、在WEB页面中添加上传输入项,<input type=“life”name=“”>,使用时注意:1. 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。

2. 必须把input项的enctype属值设为multipart/form-data.设置该值后,浏览器二、在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

#如何在Servlet中读取文件上传数据,并保存到服务器本地硬盘中?Request对象提供了一个getInputStream()方法,使用这个方法可以获取浏览器提交过来的输入流。

但如果浏览器上传多个文件时,我们应该如何区分开来?这是一项复杂的工作。

为了方便用户处理文件上传数据,Apache开源组织提供了用于处理上面应用的开源组件——Commons-fileupload。

这个组件使用简单,性能也比较优异,所以几乎都使用它来实现上传文件的处理功能。

Struts的上传文件处理部分也是使用它实现的。

#Fileupload组件工作流程:WEB服务器requestServletFileupLoadDiskFileItemFactory代表普通字段的FileItem代表上传文件1FileItem代表上传文件2FileItemisFileFormgetFieldNamegetStringgetInputStreamgetNamegetInputStreamgetName核心API-DiskFileItemFactory:DiskFileItemFactory是创建FileItem对象的工厂,这个工厂常用方法:1. public DiskFileItemFactory(int sizeThreshold, java.io.File repository),常用的构造函数。

Demo_通过JavaWeb完成文件下载

Demo_通过JavaWeb完成文件下载

Demo_通过JavaWeb完成⽂件下载⽂件下载的实质就是⽂件拷贝,将⽂件从服务器端拷贝到浏览器端。

所以⽂件下载需要IO技术将服务器端的⽂件使⽤InputStream读取到,在使⽤ ServletOutputStream写到response缓冲区中。

代码如下:上述代码可以将图⽚从服务器端传输到浏览器,但浏览器直接解析图⽚显⽰在页⾯上,⽽不是提供下载,我们需要设置两个响应头,告知浏览器的类型和⽂件的打开⽅式。

1)告知浏览器⽂件的类型:response.setContentType(⽂件的MIME类型);2)告⽰浏览器⽂件的打开⽅式是下载:response.setHeader("Content-Disposition","attachment;filename=⽂件名称");代码如下:但是,如果下载中⽂⽂件,页⾯在下载时会出现中⽂乱码或不能显⽰⽂件名的情况,原因是不同的浏览器默认对下载⽂件的编码⽅式不同,ie是UTF-8编码⽅式,⽽⽕狐浏览器是Base64编码⽅式。

所⾥这⾥需要解决浏览器兼容性问题,解决浏览器兼容性问题的⾸要任务是要辨别访问者是ie还是⽕狐(其他),通过Http请求体中的⼀个属性可以辨别解决乱码⽅法如下(不要记忆--了解):if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// ⽕狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?"+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}其中agent就是请求头User-Agent的值关于Response的细节点需要注意:① response 获得的流不需要⼿动关闭,Tomcat容器会帮助我们关闭② getWriter 和 getOutputStream 不能同时调⽤。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【黑马程序员】Java Web文件下载功能实现需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片。

两种实现方法:
一:通过超链接实现下载
在HTML网页中,通过超链接链接到要下载的文件的地址
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>通过链接下载文件</h1>
<a href="/day06/download/cors.zip">压缩包</a>
<a href="/day06/download/1.png">图片</a>
</body>
</html>
其中day06/download是文档路径,本实例的程序结构如下:
程序运行后,可以通过单击需要下载文档实现下载
但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。

只有浏览器不能识别该文件格式的时候,才会实现下载。

因此利用第二种方法实现下载功能。

二:通过Servlet程序实现下载
通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>通过链接下载文件</h1>
<a href="/day06/download/cors.zip">压缩包</a>
<a href="/day06/download/1.png">图片</a>
<h1>通过servlet程序下载文件</h1>
<a href="/day06/ServletDownload?filename=cors.zip">压缩包</a>
<a href="/day06/ServletDownload?filename=1.png">图片</a>
</body>
</html>
其中,/day06/ServletDownload 是servlet程序的映射路径
然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload
添加代码如下:
package com.lsgjzhuwei.servlet.response;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletDownload
*/
@WebServlet(asyncSupported = true, urlPatterns = { "/ServletDownload" }) public class ServletDownload extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletDownload() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//获得请求文件名
String filename = request.getParameter("filename");
System.out.println(filename);
//设置文件MIME类型
response.setContentType(getServletContext().getMimeType(filename));
//设置Content-Disposition
response.setHeader("Content-Disposition",
"attachment;filename="+filename);
//读取目标文件,通过response将目标文件写到客户端
//获取目标文件的绝对路径
String fullFileName = getServletContext().getRealPath("/download/" + filename);
//System.out.println(fullFileName);
//读取文件
InputStream in = new FileInputStream(fullFileName);
OutputStream out = response.getOutputStream();
//写文件
int b;
while((b=in.read())!= -1)
{
out.write(b);
}
in.close();
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
重启tomcat服务器,即可实现对压缩包和对图片的下载。

相关文档
最新文档