文件的上传与下载案例

要求:

  提供文件上传,上传大小有要求

  有页面显示已上传列表

  可以在上传列表中去下载文件



首先是jsp页面,一个是主页面,是否,有两个选择——上传和下载列表

代码如下:(index.jsp)

 <body>
    <a href="${pageContext.request.contextPath }/demo/upload.jsp">文件上传</a>  
    <a href="${pageContext.request.contextPath }/fileServlet?method=downList">文件下载</a>
  </body>

然后是文件上传的页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>upload.jsp</title>
  </head>
  <body>
   <center>
   	 <form action="${pageContext.request.contextPath }/fileServlet?method=upload" method="post" enctype="multipart/form-data">
   	 用户名:<input type="text" name="userName"/>
   	 文件 :<input type="file" name="file_img"/>
   	 <input type="submit" value="提交"/>
    </form>
   </center>
  </body>
</html>

接着是文件的servlet处理(在服务器端我创建了一个文件夹(upload)用于存放上传文件)

package com.gqx.demoServlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class fileServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取请求参数,区分是什么方法
		String method=request.getParameter("method");
		if ("upload".equals(method)) {
			//上传
			try {
				upload(request,response);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		if ("downList".equals(method)) {
			//下载
			downList(request,response);
		}

		if ("down".equals(method)) {
			try {
				down(request,response);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	private void upload(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		//1、创建工厂类对象
		DiskFileItemFactory 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 fileItem : list) {
				//判断是否为普通文本数据
				if (fileItem.isFormField()) {
					//普通文本数据
					String name=fileItem.getFieldName();
					String value=fileItem.getString();
					System.out.println(name+":"+value);
				}else {
					//文件上传
					//获取文件名称
					String name=fileItem.getName();
					/***处理上传文件重命名问题**/
					//a、先得到唯一的标记
					String id=UUID.randomUUID().toString();		//生成一组唯一的字符串
					//b、拼接文件名
					name=id+"#"+name;

					//得到文件上传目录
					String basePath=getServletContext().getRealPath("/upload");
					//创建文件的上传对象
					File file =new File(basePath,name);
					//开始上传
					fileItem.write(file);
					//删除组件运行的时候产生的临时文件
					fileItem.delete();
				}
			}
		}
		response.sendRedirect(request.getServletContext().getContextPath()+"/demo/index.jsp");

	}

	private void downList(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		/**实现思路:现货区upload目录下的所有文件的文件名,在保存,跳转到down.jsp列表展示*/
		//1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;
		Map<String,String> fileMap=new HashMap<String, String>();
		//2、获取上传目录,及其所有文件的文件名
		String basePath=getServletContext().getRealPath("/upload");
		//目录
		File file=new File(basePath);
		//目录下所有文件名
		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.indexOf("#")+1);
				//封装
				fileMap.put(fileName, shortName);
			}
		}

		//3、保存到request域fileNamess
		request.setAttribute("fileNames", fileMap);
		request.getRequestDispatcher("/demo/downList.jsp").forward(request, response);
	}

	/**
	 * 处理文件下载
	 * @param request
	 * @param response
	 */
	private void down(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		//获取用户下载的文件名(url后面追加的,get请求)
		String fileName=request.getParameter("fileName");
		fileName=new String(fileName.getBytes("iso-8859-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[] bytes=new byte[1024];
		int len=-1;
		while((len=in.read(bytes))!=-1){
			out.write(bytes,0,len);
		}
		out.close();
		in.close();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}

有了它,就可以得到文件的列表及下载页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP ‘downList.jsp‘ starting page</title>
  </head>

  <body>
   	<table border="1" align="center">
   		<tr>
   			<th>序号</th>
   			<th>文件名</th>
   			<th>操作</th>
   		</tr>
   		<c:forEach items="${requestScope.fileNames }" var="en" 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">	<!-- 默认是当前的目录,如果要改到其他的项目,就写context="/another" -->
   						<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>
</html>

效果如图

上传的列表与下载的文件

时间: 2024-08-27 06:24:16

文件的上传与下载案例的相关文章

SpringMVC实现文件的上传和下载

前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务器进行文件操作的时候使用的是 Xshell 推荐安装的一个工具 Xftp 5,然而,昨天自己想着从服务器下载备份好的的数据库文件到本地的时候发现这个文件传输工具居然过期不能用了,好气啊!于是没办法(机智如我)只好用 Python 来实现 SSH 的连接,顺便从服务器批量下载一些文件,实现自动化. 项

Spring MVC 实现文件的上传和下载

文件上传是项目开发中最常见的功能.为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器. 一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应.在2003年,Apache Software Foundation发布了开源的Commons File

使用Loadrunner进行文件的上传和下载

最近使用loadrunner中需要录制文件的上传和下载,上传功能模块利用录制可以直接实现,下载无法实现,在网上找到了一段代码,自己动手试验了下,发现没有用 辛苦找到的,还是记录下吧 (1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST", "EncTy

【Linux命令】--(4)文件打包上传和下载

文件打包上传和下载 +++++++++++++++++++++++++++++++用SecureCRT来上传和下载文件tar命令gzip命令+++++++++++++++++++++++++++++++先把计划放着,待老夫国庆把它学完!

【php】文件的上传与下载

一. 生活中常见的地方: a) 例如邮箱.空间.文库.百度云.微爱等地方,都可以看到文件的上传和下载的应用,因此,上传和下载的功能非常重要!二. PHP当中的文件上传和下载 a) 我们需要进行一些设置,来使我们的表单具有提交文件的功能! b) 客户端的设置: i. 其实就是表单的设置: 1. input表单项中的type属性值必须是file类型 2. form表单头部需要添加一个通行证:enctype="multipart/form-data",含义为让服务器认识到我们要在这个表单中上

SecureCRT使用sz和rz命令进行文件的上传和下载

SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. 本地文件夹可以通过Options-->Session Options中进行设置.

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

JSP中文件的上传于下载示例

一.文件上传的原理 1.文件上传的前提: a.form表单的method必须是post b.form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的数据类型) 注意:当表单的enctype是multipart/form-data,传统的获取请求参数的方法失效. 请求正文:(MIME协议进行描述的,正文是多部分组成的) -----------------------------7dd32c39803b2 Content-Disposition: