miracle just wanna be better

文件的上传和下载(upload)

2019-08-20
miracle

下载

  • http://commons.apache.org/中有很多文档,可以直接阅读使用
    我们需要上传下载功能,也能在官方文档查找到

    表单下载(推荐)

    在web.xml中加局部变量,contentType内容类型

<servlet>
    <description></description>
    <display-name>FileuploadServlet</display-name>
    <servlet-name>FileuploadServlet</servlet-name>
    <servlet-class>cn.tedu.servlet.FileuploadServlet</servlet-class>
    <init-param>
      <param-name>contenttype</param-name>
      <param-value>image/png;application/zip;text/plain;application/vnd.openxmlformats-officedocument.wordprocessingml.document</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>FileuploadServlet</servlet-name>
    <url-pattern>/FileuploadServlet.do</url-pattern>
  </servlet-mapping>

加入表单,表单中选择文件,写说明,和一个上传按钮

<form 	method="POST" 
		enctype="multipart/form-data"
	 	action="FileuploadServlet.do">
		 	文件: <input type="file" name="upfile"><br/>
		 	说明: <input type="text" name="note"><br/>
	  		<br/>
	  		<input type="submit" value="上传"> to upload the file!
	</form>

servlet具体功能
FileuploadServlet.java

private List<String> fileTypes=new ArrayList<String>();//定义一个集合,里面是文件类型的字符串

初始化时,将xml中的变量读入,用分号分开,加到集合中

public void init() throws ServletException {
		String contenttype=this.getInitParameter("contenttype");
		String[] contenttypes=contenttype.split(";");
		for(String ct:contenttypes){
			fileTypes.add(ct);
		}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out=response.getWriter();
			// Check that we have a file upload request
			// 检查我们有一个文件上传请求
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			if(isMultipart){
				//说明request中有一个文件
				// Create a factory for disk-based file items
				//创建一个磁盘文件条目工厂,工厂生产对象
				DiskFileItemFactory factory = new DiskFileItemFactory();
				// Create a new file upload handler
				ServletFileUpload upload = new ServletFileUpload(factory);
				// Parse the request
				//把request中的数据,转换成list集合,元素类型为fileItem
				List<FileItem> items = upload.parseRequest(request);
				// Process the uploaded items
				//处理上传的条目
				Iterator<FileItem> iter = items.iterator();
				while (iter.hasNext()) {
				    FileItem item = iter.next();
				    if (item.isFormField()) {
				    	//是非文件域,除了文件之外的input
				        String name=item.getFieldName();//<input name>
				        String value=item.getString();//<input value>
				        System.out.println(name+" "+value);
				        if("note".equals(name)){
				        	String noteValue=item.getString();
				        }
				    } else {
				    	//是文件域<input type="file"processUploadFile(item)
				    	String fieldName=item.getFieldName();
				    	String fileName=item.getName();//获取真实文件名
				    	String contentType=item.getContentType();//获取文件内容类型
				    	boolean isInMemory=item.isInMemory();//是否在内存中
				    	long sizeInBytes=item.getSize();//获取文件的长度
				    	System.out.println(fieldName+" "+fileName+" "+contentType+" "+isInMemory+" "+sizeInBytes);
				    	//处理获取真实的文件名,因为浏览器的差异,导致文件名前带有路径,用此功能去掉路径
				    	if(fileName!=null){
				    		fileName=FilenameUtils.getName(fileName);
				    	}
				    	if(fileTypes.contains(contentType)){
				    		if(sizeInBytes<4194304){
				    		//准备上传文件在服务器的存储路径
					    	String realPath=this.getServletContext().getRealPath("/upload");
					    	System.out.println(realPath);
					    	File file=new File(realPath);
					    	if(!file.exists()){
					    		file.mkdir();
					    	}
					    	//把文件上传到upload文件夹
					    	File uploadFile=new File(file,fileName);
					    	item.write(uploadFile);//把文件写到具体路径
					    	out.println("<div sty='color:red;'>上传文件成功</div>");
				    		}else{
				    			out.println("<div sty='color:red;'>文件太大</div>");
				    		}
				    	}else{
				    		out.println("<div sty='color:red;'>文件类型不匹配</div>");
				    	}
				    	
				    }
				    
				}
			}
			out.flush();
			out.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

批量文件上传(表单提交)

上面实现了单文件上传,我们要实现多文件下载,通过js动态添加表单列表,实现多文件的下载,servlet不变,变量依然需要添加

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function addMore(){
		var td_ele=document.getElementById("more");
		var br_ele=document.createElement("br");
		
		var input_file=document.createElement("input");
		input_file.type="file";
		input_file.name="upfile";
		
		var input_button=document.createElement("input");
		input_button.type="button";
		input_button.value="删除";
		
		//给删除按钮添加click事件
		input_button.onclick=function(){
			td_ele.removeChild(input_file);
			td_ele.removeChild(input_button);
			td_ele.removeChild(br_ele);
			
		}
		//把新建的对象挂载到dom文档树
		td_ele.appendChild(br_ele);
		td_ele.appendChild(input_file);
		td_ele.appendChild(input_button);
	}
</script>
</head>
<body>
	<form action="FileuploadServlet.do" method="post" enctype="multipart/form-data"/>
	<table border="1" align="center">
		<tr>
			<td>上传文件</td>
			<td id="more">
				<input type="file" name="upload">
				<input type="button" value="添加..." onclick="addMore();">
			</td>
		</tr>
		<tr>
			<td>文件说明</td>
			<td>
				<input type="text" name="note"/>
			</td>
		</tr>
		<tr>
			<td colspan="2"></td>
			<td>
				<input type="submit" value="上传"/>
			</td>
		</tr>
	</table>
	</form>
</body>

文件上传ajax

<script type="text/javascript" src="js/common/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/common/ajaxfileupload.js"></script>
<script type="text/javascript" src="js/upload.js"></script>
<form id="formid">
	  上传文件: <input id="fileid" type="file" name="upfile"><br/>
	  文件说明 <input type="text" name="note"><br/>
	  文件说明 <input type="text" name="note1"><br/>
	  <br/>
     <input type="submit" value="上传"> 
</form>

没有action,只有表单显示,引入了JavaScript,jquery,和别人写好的ajaxfileupload.js

$(function(){
	$("#formid").submit(function(){
		return upload_file();//false 终止html页面的表单提交,引申义就让submit方法提交
	});
});
function upload_file(){
	var note=$("#formid input[name=note]").val();
	var note1=$("#formid input[name=note1]").val();
	alert(note+"   "+note1);
	//ajax异步提交上传文件
	$.ajaxFileUpload({
		url:"/testmavenfileupload/FileuploadServlet_Ajax.do",
		secureuri:false,//请求的路径不是一个安全的路径
		fileElementId:"fileid",
		type:"post",
		dataType:"text",
		data:{"n":note,"nn":note1},
		success:function(data,status){
			alert(data)
		},
		error:function(){
			alert("请求失败!");
		}
	});
	return false;
}

文件下载(普通文件)

<a href="DownLoadServlet.do?fileName=啊啊.png">啊啊.png</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取要下载的文件名
		String fileName=request.getParameter("fileName");
		//检测文件在服务器中是否存在
		String realPath=this.getServletContext().getRealPath("/upload");
		//拼装一个完整的路径
		String allPath=realPath+File.separator+fileName;
		System.out.println("allPath="+allPath);
		File file=new File(allPath);
		if(file.exists()){
			//文件存在可以下载
			//要想下载文件,必须给response对象设置一个消息头
			response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1"));
			//开始下载文件
			OutputStream os=response.getOutputStream();
			//先从服务器本地把文件读入到内存中
			InputStream is=new FileInputStream(file);
			byte[] buf=new byte[1024];
			int len=-1;
			while((len=is.read(buf))!=-1){
				os.write(buf,0,len);
			}
			os.flush();
			os.close();
			is.close();
		}
	}

下载csv文件

<a href="DownLoadCSVServlet.do">下载csv格式文件</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/x-msdownload");
		response.setHeader("Content-Disposition", "attachment;filename=download.csv");
		OutputStream os=response.getOutputStream();
		String csvText="";
		for(int i=0;i<10;i++){
			for(int j=0;j<10;j++){
				csvText+=i*j+",";
			}
			csvText+="\n";
		}
		os.write(csvText.getBytes(),0,csvText.length());
		os.flush();
		os.close();
	}

下一篇 spring框架

Comments

Content