文件上传与下载

前端代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 上传 -->>
	<form action="UploadServlet" method="post" enctype="multipart/form-data">
		学号:<input type="text" name="sno" /><br/>
		姓名:<input type="text" name="sname" /><br/>
		上传照片:<input type="file" name="spicture" /><br/>
		<input type="submit" value="上传" /><br/>
	</form>
	<!-- 下载 -->>
	<a href="DownloadServlet?filename=MIME.png">图片</a>
</body>
</html>

UploadServlet代码

上传操作需要两个jar包,commons-fileupload和commons-io
commons-fileupload 依赖 于 commons-io
两者可以取 官网 或 maven 下载

package org.student.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {
     

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=UTF-8");
		
		try {
     
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		if(isMultipart) {
     //判断form表单是否有multipart属性
			DiskFileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload( factory);
			
			
			//设置上传文件时 临时内存的大小
//			factory.setSizeThreshold(10240);
//			设置文件的临时目录
//			factory.setRepository(new File("D:\\eclipse-jee-oxygen-R-win32-x86_64\\uploadtemp"));
//			//控制上传单个文件大小
//			upload.setSizeMax(20480);//字节B
			
			
			//通过parseRequest解析form表单所有请求字段,并封装在fileitem对象中
			List<FileItem> items=upload.parseRequest(request);
			
			Iterator<FileItem> iter = items.iterator();
			while(iter.hasNext()) {
     
				FileItem item = iter.next();
				//根据name属性,判断是表单的哪个字段
				String itemName = item.getFieldName();
				
				int sno = -1;
				String sname = null;
				//判断前台字段是普通的表单字段,还是文件字段
				if(item.isFormField()) {
     
					if(itemName.equals("sno")) {
     
						sno = Integer.parseInt(item.getString("UTF-8"));
					}else if (itemName.equals("sname")) {
     
						sname = item.getString("UTF-8");
					}else {
     
						System.out.println("其他字段");
					}
				}else {
     
					//文件上传
					//拿文件名
					String filename = item.getName();
					
					//限制上传文件的类型或者大小
					String ext = filename.substring(filename.indexOf(".")+1);
					if(!(ext.equals("png") || ext.equals("jpg"))) {
     
						System.out.println("上传照片类型有误!");
						return ;//终止代码
					}
					
					
					//(项目部署得到路径)
					String path  = request.getSession().getServletContext().getRealPath("upload");
					System.out.println(path);//查看项目部署路径
					File file = new File(path,filename);
					
					item.write(file);//上传
					
					System.out.println(filename+"-上传成功");
					
					return ;
				}
				
				
			}
			
			
		}
		} 
//		文件过大则上传失败抛出异常
//		catch (FileUploadBase.SizeLimitExceededException e) {
     
//			System.out.println("上传文件大小过大!!");
//			e.printStackTrace();
//		}
		catch (FileUploadException e) {
     
			e.printStackTrace();
		}catch (Exception e) {
     
			e.printStackTrace();
		}
		
		
	}

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

}

DownloadServlet代码

package org.student.servlet;

import java.io.IOException;
import java.io.InputStream;

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 {
     

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
     
		request.setCharacterEncoding("utf-8");
		String fileName = request.getParameter("filename");
		// 下载文件:需要设置 消息头
		response.addHeader("content-Type", "application/octet-stream");//二进制
		//当下载的文件名是中文的时候,下面的头消息需要特别处理,不同浏览器有不同的处理方法,自行百度
		response.addHeader("content-Disposition", "attachement;filename=" + fileName);
		
		InputStream in = getServletContext().getResourceAsStream("/res/MIME.png");
		
		//以响应的方式输出到jsp
		ServletOutputStream out = response.getOutputStream();
		byte[] bs = new byte[100];
		int len = -1;
		
		while( (len=in.read(bs)) != -1 ) {
     
			out.write(bs,0,len);
		}
		out.close();
		in.close();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
     
		doGet(request, response);
	}

}

你可能感兴趣的:(Java,upload,java,servlet)