文件上传与下载

来源:互联网 发布:洪瑛琦淘宝店铺 编辑:程序博客网 时间:2024/06/01 08:33

1.文件上传

案例:

注册表单/保存商品等相关模块

-->注册选择头像/商品图片

(数据库:存储图片路径/图片保存到服务器中指定目录)


要点:

a.提交方式:post

b.表单中有文件上传的表单项:<input type="file" />

c.指定表单类型:(默认enctype="application/x-www-form-urlencoded")

文件上传类型:multipart/form-data

2.手动上传

<body><form name="frm_test" action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">    用户名:<input type="text" name="userName">  <br/>   文件:   <input type="file" name="file_img">   <br/>      <input type="submit" value="注册">    </form></body>



public class UploadServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*request.getParameter(""); // GET/POSTrequest.getQueryString(); // 获取GET提交的数据 request.getInputStream(); // 获取post提交的数据   *//***********手动获取文件上传表单数据************///1. 获取表单数据流InputStream in =  request.getInputStream();//2. 转换流InputStreamReader inStream = new InputStreamReader(in, "UTF-8");//3. 缓冲流BufferedReader reader = new BufferedReader(inStream);// 输出数据String str = null;while ((str = reader.readLine()) != null) {System.out.println(str);}// 关闭reader.close();inStream.close();in.close();}

3.Apache提供的文件上传组件:FileUpload组件


public class UploadServlet extends HttpServlet {// upload目录,保存上传的资源public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*********文件上传组件: 处理文件上传************/try {// 1. 文件上传工厂FileItemFactory factory = new DiskFileItemFactory();// 2. 创建文件上传核心工具类ServletFileUpload upload = new ServletFileUpload(factory);// 一、设置单个文件允许的最大的大小: 30Mupload.setFileSizeMax(30*1024*1024);// 二、设置文件上传表单允许的总大小: 80Mupload.setSizeMax(80*1024*1024);// 三、 设置上传表单文件名的编码// 相当于:request.setCharacterEncoding("UTF-8");upload.setHeaderEncoding("UTF-8");// 3. 判断: 当前表单是否为文件上传表单if (upload.isMultipartContent(request)){// 4. 把请求数据转换为一个个FileItem对象,再用集合封装List<FileItem> list = upload.parseRequest(request);// 遍历: 得到每一个上传的数据for (FileItem item: list){// 判断:普通文本数据if (item.isFormField()){// 普通文本数据String fieldName = item.getFieldName();// 表单元素名称String content = item.getString();// 表单元素名称, 对应的数据//item.getString("UTF-8");  指定编码System.out.println(fieldName + " " + content);}// 上传文件(文件流) ----> 上传到upload目录下else {// 普通文本数据String fieldName = item.getFieldName();// 表单元素名称String name = item.getName();// 文件名String content = item.getString();// 表单元素名称, 对应的数据String type = item.getContentType();// 文件类型InputStream in = item.getInputStream(); // 上传文件流/* *  四、文件名重名 *  对于不同用户readme.txt文件,不希望覆盖! *  后台处理: 给用户添加一个唯一标记! */// a. 随机生成一个唯一标记String id = UUID.randomUUID().toString();// b. 与文件名拼接name = id +"#"+ name;// 获取上传基路径String path = getServletContext().getRealPath("/upload");// 创建目标文件File file = new File(path,name);// 工具类,文件上传item.write(file);item.delete();   //删除系统产生的临时文件System.out.println();}}}else {System.out.println("当前表单不是文件上传表单,处理失败!");}} catch (Exception e) {e.printStackTrace();}}

4.文件上传与下载,完整案例:

4.1文件上传

4.2列表下载

Index.jsp<body>  <a href="${pageContext.request.contextPath }/upload.jsp">文件上传</a>      <a href="${pageContext.request.contextPath }/fileServlet?method=downList">文件下载</a>     </body>Upload.jsp<body>   <form name="frm_test" action="${pageContext.request.contextPath }/fileServlet?method=upload" method="post" enctype="multipart/form-data">    <%--<input type="hidden" name="method" value="upload">--%>        用户名:<input type="text" name="userName">  <br/>   文件:   <input type="file" name="file_img">   <br/>      <input type="submit" value="提交">    </form>  </body>Downlist.jsp<body><table border="1" align="center"><tr><th>序号</th><th>文件名</th><th>操作</th></tr><c:forEach var="en" items="${requestScope.fileNames}" varStatus="vs"><tr><td>${vs.count }</td><td>${en.value }</td><td><%--<a href="${pageContext.request.contextPath }/fileServlet?method=down&..">下载</a>--%><!-- 构建一个地址  --><c:url var="url" value="fileServlet"><c:param name="method" value="down"></c:param><c:param name="fileName" value="${en.key}"></c:param></c:url><!-- 使用上面地址 --><a href="${url }">下载</a></td></tr></c:forEach></table>    </body>FileServlet.java/** * 处理文件上传与下载 * @author Jie.Yuan * */public class FileServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取请求参数: 区分不同的操作类型String method = request.getParameter("method");if ("upload".equals(method)) {// 上传upload(request,response);}else if ("downList".equals(method)) {// 进入下载列表downList(request,response);}else if ("down".equals(method)) {// 下载down(request,response);}}/** * 1. 上传 */private void upload(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {// 1. 创建工厂对象FileItemFactory factory = new DiskFileItemFactory();// 2. 文件上传核心工具类ServletFileUpload upload = new ServletFileUpload(factory);// 设置大小限制参数upload.setFileSizeMax(10*1024*1024);// 单个文件大小限制upload.setSizeMax(50*1024*1024);// 总文件大小限制upload.setHeaderEncoding("UTF-8");// 对中文文件编码处理// 判断if (upload.isMultipartContent(request)) {// 3. 把请求数据转换为list集合List<FileItem> list = upload.parseRequest(request);// 遍历for (FileItem item : list){// 判断:普通文本数据if (item.isFormField()){// 获取名称String name = item.getFieldName();// 获取值String value = item.getString();System.out.println(value);} // 文件表单项else {/******** 文件上传 ***********/// a. 获取文件名称String name = item.getName();// ----处理上传文件名重名问题----// a1. 先得到唯一标记String id = UUID.randomUUID().toString();// a2. 拼接文件名name = id + "#" + name;// b. 得到上传目录String basePath = getServletContext().getRealPath("/upload");// c. 创建要上传的文件对象File file = new File(basePath,name);// d. 上传item.write(file);item.delete();  // 删除组件运行时产生的临时文件}}}} catch (Exception e) {e.printStackTrace();}}/** * 2. 进入下载列表 */private void downList(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示//1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;Map<String,String> fileNames = new HashMap<String,String>();//2. 获取上传目录,及其下所有的文件的文件名String bathPath = getServletContext().getRealPath("/upload");// 目录File file = new File(bathPath);// 目录下,所有文件名String list[] = file.list();// 遍历,封装if (list != null && list.length > 0){for (int i=0; i<list.length; i++){// 全名String fileName = list[i];// 短名String shortName = fileName.substring(fileName.lastIndexOf("#")+1);// 封装fileNames.put(fileName, shortName);}}// 3. 保存到request域request.setAttribute("fileNames", fileNames);// 4. 转发request.getRequestDispatcher("/downlist.jsp").forward(request, response);}/** *  3. 处理下载 */private void down(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取用户下载的文件名称(url地址后追加数据,get)String fileName = request.getParameter("fileName");fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");// 先获取上传目录路径String basePath = getServletContext().getRealPath("/upload");// 获取一个文件流InputStream in = new FileInputStream(new File(basePath,fileName));// 如果文件名是中文,需要进行url编码fileName = URLEncoder.encode(fileName, "UTF-8");// 设置下载的响应头response.setHeader("content-disposition", "attachment;fileName=" + fileName);// 获取response字节流OutputStream out = response.getOutputStream();byte[] b = new byte[1024];int len = -1;while ((len = in.read(b)) != -1){out.write(b, 0, len);}// 关闭out.close();in.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}



原创粉丝点击