0
点赞
收藏
分享

微信扫一扫

学习javaweb第十五天

三维控件研究 2022-01-09 阅读 73
java

文件上传和下载

文件上传
要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。

上传大多数情况是通过表单的形式提交给服务器,使用标签。

使用标签需要注意以下两点:

1.必须设置name属性,不然浏览器不会发送上传文件的数据。

2.必须将method属性设置为post,ectype属性设置为“multipart/form-data”类型。

由于在Servlet直接读取上传数据,并且解析出相应文件数据是一项非常麻烦的工作。为了方便处理上传数据,Apache组织提供了一个开源组件Commons-FileUpload。该组件可以将“multipart/form-data”类型请求的各种表单域解析出来,并实现一个或多个文件上传,同时也可以限制上传文件的大小等内容。其性能十分优异,使用极其简单。

对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
  
开发环境搭建
创建一个chapter12项目,加入Apache的commons-fileupload文件上传组件的相关Jar包
在这里插入图片描述
实现文件上传

创建上传页面
创建一个form.jsp的j页面,该页面用于提供文件上传的form表单

<%@ 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>文件上传</title>
</head>
<body>
 	<form action="UploadServlet" method="post"   enctype="multipart/form-data">
 		<table width="600px">
 			<tr>
 				<td>上传者</td>
 				<td><input type="text" name="username" /></td>
 			</tr>
 			<tr>
 				<td>上传文件</td>
 				<td><input type="file" name="myfile" /></td>
 			</tr>
 			<tr>
 				<td colspan="2"><input type="submit" value="上传" /></td>
 			</tr>
 		</table>
 	</form>
</body>
</html>

创建Servlet
编写一个UploadServlet的类,该类主要用于获取表单及其上传文件的信息

package cn.itcast.fileupload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @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");
			
			DiskFileItemFactory factory=new DiskFileItemFactory();
			
			File f=new File("d:\\Temp");
			if(!f.exists()) {
				f.mkdirs();
			}
			
			factory.setRepository(f);
			factory.setSizeThreshold(1024*1024);
			
			ServletFileUpload fileupload=new ServletFileUpload(factory);
			fileupload.setHeaderEncoding("utf-8");
			List<FileItem> fileitems=fileupload.parseRequest(request);
			
			for(FileItem fileitem:fileitems) {
				boolean flag=fileitem.isFormField();
				if(flag) {
					
					String name=fileitem.getFieldName();
					if(name.equals("username")) {
						if(!fileitem.getString().equals("")) {
							
							String value=fileitem.getString("utf-8");
							
							response.getWriter().print("上传者:"+value+"<br/>");
						}
					}
				}else {
					String filename=fileitem.getName();
					if(filename!=null&& !filename.equals("")) {
						
						response.getWriter().print("上传的文件名称:"+filename+"<br/>");
						filename=filename.substring(filename.lastIndexOf("\\")+1);
						
						filename=UUID.randomUUID().toString()+"_"+filename;
						
						String webPath="/upload2005/";
						
						String filepath=getServletContext().getRealPath(webPath+filename);
						
						File file=new File(filepath);
						file.getParentFile().mkdirs();
						file.createNewFile();
						
						InputStream in=fileitem.getInputStream();
						FileOutputStream out=new FileOutputStream(file);
						
						byte[] buffer=new byte[1024];
						int len=0;
						while((len=in.read(buffer))>0) {
							out.write(buffer,0,len);
						}
						
						in.close();
						out.close();
						
						fileitem.delete();
						response.getWriter().print("文件上传成功"+"<br/>");
						
					}
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

启动项目,查看运行结果
在这里插入图片描述
在这里插入图片描述
文件下载
创建下载页面download.jsp该页面中编写了一个用于下载的链接

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="java.net.URLEncoder"%>
<!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>文件下载</title>
</head>
<body>
<a href="/chapter12/DownloadServlet?filename=重庆.jpg">文件下载</a>

</body>
</html>

创建Servlet
创建DownloadServlet类,该类主要用于设置所要下载的下载以及文件在浏览器中的打开方式

package cn.itcast.fileupload;

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

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

/**
 * Servlet implementation class DownloadServlet
 */
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	      
		  response.setContentType("text/html;charset=utf-8");
		  String filename=request.getParameter("filename");
		  filename=new String (filename.getBytes("iso-8859-1"),"utf-8");
		  
		  String fileType=getServletContext().getMimeType(filename);
		  
		  response.addHeader("Content-Type", fileType);
		  response.addHeader("Content-Disposition", "attachment;filename");
		  
		  String folder="/download/";
		  
		  InputStream in=getServletContext().getResourceAsStream(folder+filename);
		  OutputStream out=response.getOutputStream();
		  
		  byte[] buffer=new byte[1024];
		  int len=0;
		  while((len=in.read(buffer))>0) {
			  out.write(buffer,0,len);
		  }
		  
		  in.close();
		  out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

创建下载目录及文件
在项目的WebContent目录下创建一个名称为download的文件夹,在该文件中放置一个重庆.jpg文件。

启动项目,查看结果
在这里插入图片描述

举报

相关推荐

打卡学习第十五天

HCIP 第十五天

HCIP第十五天

学习C语言第十五天

学习python的第十五天

第十五天6号

学习JAVA的第十五天(基础)

学习STM32第十五天

0 条评论