web上传与下载文件

文件上传

上传文件需要用到两个jar包
commons-fileupload.jar
commons-io.jar

现将两个包导入项目的lib目录下:
在这里插入图片描述

前台jsp代码

要想上传文件,form表单中就要添加encType属性,属性值为multipart/form-data
注:提交方式必须为post,get方式受地址栏长度影响不能传输太大的文件。

<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="cpicture"><br>
		<input type="submit" value="注册">
</form>

Servlet

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");
		
		//上传
		boolean isMuitipart = ServletFileUpload.isMultipartContent(request);
		if(isMuitipart) {  //判断前台form表单是否有multipart属性
			FileItemFactory factory = new DiskFileItemFactory() ;
			ServletFileUpload upload = new ServletFileUpload(factory);
			//通过parseRequest方法解析form表单中的所有请求字段保存在items集合中
			List<FileItem> parseRequest=null;
			try {
				parseRequest = upload.parseRequest(request);
			} catch (FileUploadException e) {
				e.printStackTrace();
			}
			Iterator<FileItem> iter = parseRequest.iterator();
			while(iter.hasNext()) {
				FileItem item = iter.next();
				String name = item.getFieldName();

				//判断item中字段是普通form字段(sno,sname)还是文件字段(spicture)
				if(item.isFormField()) {
					if(name.equals("sno")) {
						String sno = item.getString("utf-8");  //参数为编码方式
						//······
					}else if(name.equals("sname")) {
						String sname = item.getString("utf-8");
						//·········
					}else {
						System.out.println("```");
					}
				}else {   //文件字段
					//getFildName()是获取form字段名,
					//getName()获取文件名
					String fileName = item.getName();
					//开始上传
					String path = "D:\\英雄时刻";
					File file = new File(path,fileName);
					try {
						item.write(file);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			
		}
	
	}

文件下载

文件下载,只需在表示层前台代码传文件名给Servlet,Servlet读取文件在传给客户即可。
前台代码请求Servlet:

<a href="DownloadServlet?filename=取消的网课.txt">下载照片</a>

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		//获取文件名,转为ISO-8859-1是为了能够显示中文文件名称
		String filename = new String(request.getParameter("filename").getBytes(),"ISO-8859-1");
		
		//设置两个消息头
		response.addHeader("content-Type", "application/octet-stream");//第二个参数为MIME类型
		response.addHeader("content-Disposition", "attachement;filename="+filename);
		
		
		//Servlet通过文件地址将该文件转为输入流 读到servlet中
		InputStream in = getServletContext().getResourceAsStream("/res/取消的网课.txt");
		
		//通过输出流将文件 输出给用户
		ServletOutputStream out = response.getOutputStream();
		byte[] bytes = new byte[10];
		int len = -1;
		while( (len=in.read(bytes)) != -1 ) {
			out.write(bytes, 0, len);
		}
		out.close();
		in.close();
	}

注:文件拓展名与Content-Type对应表:http://www.fairysoftware.com/content_type.html
常见类型:

文件类型 Content-Type
二进制文件 application/octet-stream
Word application/msword
Excel application/vnd.ms-excel
PPT application/x-ppt
PDF application/pdf
图片 image/gif 、image/bmp 、image/jpeg
文本文件 text/plain
发布了20 篇原创文章 · 获赞 0 · 访问量 486

猜你喜欢

转载自blog.csdn.net/qq_43635212/article/details/104362031