20、文件上传与下载

20文件上传与下载

  1. 文件上传
  • 上传用户头像
  • 某些东西的详细信息中的图片
  • 文件上传的地方

-数据库:一般存储字段信息,不适合存储文件

-服务器:文件一般都上传到服务器(图片、视频等),正常将上传的文件放在项目的某个地方

  • 文件上传准备:

-在表单上有上传按钮

头像:<input name="fileupload" type="file">

-所有的文件上传,method=post

-文件上传的表单,enctype=“multipart/form-data”

-点击提交,将文件的流以及表单的所有内容都放在流里提交,request.getParamter(),对文件上传表单提交是无效的

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username=request.getParameter("username");
		String headerImg=request.getParameter("fileupload");
		System.out.println("用户名:"+username);
		System.out.println("头像:"+headerImg);
		//引入commons-io包
		ServletInputStream stream=request.getInputStream();
		String string=IOUtils.toString(stream);
		System.out.println(string);
		response.sendRedirect(request.getContextPath()+"/index.jsp");
	}
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
	用户名:<input name="username" type="text">
	头像:<input name="fileupload" type="file">
	<input type="submit" value="上传">
</form>
  • 文件上传
  • 导包

在这里插入图片描述

  • jsp
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
	用户名:<input name="username" type="text">
	头像:<input name="fileupload" type="file">
	<input type="submit" value="上传">
</form>
</body>
  • java
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		// TODO Auto-generated method stub
//		String username=request.getParameter("username");
//		String headerImg=request.getParameter("fileupload");
//		System.out.println("用户名:"+username);
//		System.out.println("头像:"+headerImg);
		
		//引入commons-io包
		//获取整个请求的流
//		ServletInputStream stream=request.getInputStream();
//		String string=IOUtils.toString(stream);
//		System.out.println(string);
		
		//1.先创建一个工厂示例
		DiskFileItemFactory factory=new DiskFileItemFactory();
		//2.创建一个专门用来处理servlet文件上传的对象
		ServletFileUpload fileUpload=new ServletFileUpload(factory);
		//3.解析文件上传请求
		try {
			//返回的list,封装什么?FileItem
			//FileItem;就是封装了请求的流中的每个部件,每一个部件就对应一个FileItem
			List<FileItem> list=fileUpload.parseRequest(request);
			for(FileItem fileItem:list){
				if(fileItem.isFormField()){
					//如果为true,则为普通的key-value
					//getFieldName值就是获取的表单项的name值
					String fieldName=fileItem.getFieldName();
					//获取的是文件名(此处获取不到)
					String name=fileItem.getName();
					System.out.println("普通表单项:"+fieldName);
					System.out.println("普通表单项:"+name);
				}else{
					//false代表的是一个文件
					//getFieldName值就是获取的表单项的name值
					String fieldName=fileItem.getFieldName();
					//获取文件名,w3c标准的浏览器,文件名
					//ie获取文件的路径
					String name=fileItem.getName();
					//返回-1代表不包含,返回0。。。表示索引号
					int of=name.lastIndexOf("\\");
					String substring=name.substring(of+1);
					//如果是文件项,getInputStream获取文件项的文件流
					InputStream stream=fileItem.getInputStream();
					//IOUtils工具转换这里要注释掉,否则会出现上传的文件大小为0的情况
					//String string=IOUtils.toString(stream);
					//System.out.println(string);
					//保存流,动态获取文件夹路径
					ServletContext servletContext=getServletContext();
					String realPath=servletContext.getRealPath("/uploads");
					//uuid,这个是文件名的前缀
					String prefix=UUID.randomUUID().toString().replace("-", "");
					System.out.println(substring);
					System.out.println(realPath+"\\"+prefix+"_"+substring);
					FileOutputStream outputStream=new FileOutputStream(realPath+"\\"+prefix+"_"+substring);
					//将输入流的内容写在输出流里
					IOUtils.copy(stream, outputStream);
					//关闭输出流
					outputStream.close();
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		response.sendRedirect(request.getContextPath()+"/index.jsp");
	}
  • 步骤

1)创建工厂

DiskFileItemFactory factory=new DiskFileItemFactory();

2)创建专门用来解析servlet文件上传的对象

ServletFileUpload fileUpload=new ServletFileUpload(factory);

3)解析请求,把表单的所有的邮件封装返回,List,每个部件就是一个FileItem

List<FileItem> list=fileUpload.parseRequest(request);

4)解析每一个FileItem

for(FileItem fileItem:list){
				if(fileItem.isFormField()){
					//如果为true,则为普通的key-value
					//getFieldName值就是获取的表单项的name值
					String fieldName=fileItem.getFieldName();
					//直接获取普通表单项的值,参数为值的编码
					String string=fileItem.getString("utf-8");	
				}else{
					//false代表的是一个文件
					//getFieldName值就是获取的表单项的name值
					String fieldName=fileItem.getFieldName();
					//获取文件名,w3c标准的浏览器,文件名
					//ie获取文件的路径
					String name=fileItem.getName();
					//返回-1代表不包含,返回0。。。表示索引号
					int of=name.lastIndexOf("\\");
					String substring=name.substring(of+1);
					//如果是文件项,getInputStream获取文件项的文件流
					InputStream stream=fileItem.getInputStream();
					//IOUtils工具转换这里要注释掉,否则会出现上传的文件大小为0的情况
					//String string=IOUtils.toString(stream);
					//System.out.println(string);
					//保存流,动态获取文件夹路径
					ServletContext servletContext=getServletContext();
					String realPath=servletContext.getRealPath("/uploads");
					//uuid,这个是文件名的前缀
					String prefix=UUID.randomUUID().toString().replace("-", "");
					System.out.println(substring);
					System.out.println(realPath+"\\"+prefix+"_"+substring);
					FileOutputStream outputStream=new FileOutputStream(realPath+"\\"+prefix+"_"+substring);
					//将输入流的内容写在输出流里
					IOUtils.copy(stream, outputStream);
					//关闭输出流
					outputStream.close();
				}
			}
  1. 文件下载
  • jsp
<body>
<a href="DownloadServlet">下载</a>
</body>
  • java
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//本质就是告诉浏览器我给你的资源别直接打开,给我下载
		
		//把要下载的资源的流传给浏览器
		//1.设置响应的文件类型,文件是什么类型就设置什么类型
		//response.setContentType("");
		//获取要下载的资源文件类型
		String mimeType=getServletContext().getMimeType("/p3.png");
		response.setContentType(mimeType);
		//2.设置资源的处理方式,设置处理响应头
		//String encode=new URLEncoder().encode();
		//第一个参数就是文件名的字节数组
		String string=new  String("p3.png".getBytes("gbk"),"iso8859-1");
		response.setHeader("Content-Disposition", "attachment;filename="+string);
		//3.可选,设置文件大小response.setContentLength(len)
		//解决中文文件名问题
		String realPath=getServletContext().getRealPath("/p3.png");
		FileInputStream is=new FileInputStream(realPath);
		ServletOutputStream os=response.getOutputStream();
		IOUtils.copy(is, os);
		is.close();
		os.close();
	}

服务器部署

  1. 在eclipse中将整个项目export导出
  2. 将导出的war文件放在tomcat服务器下的webapps目录下
  3. 在tomcat服务器的bin目录下打开startup.bat启动运行服务器
  4. 设置tomcat服务需要管理员权限

安装tomcat作为一个服务

  1. 管理员权限

cd tomcat bin目录

service.bat install Tomcat6.0

  1. 删除一个服务

sc delete Tomcat6.0

目export导出

  1. 将导出的war文件放在tomcat服务器下的webapps目录下
  2. 在tomcat服务器的bin目录下打开startup.bat启动运行服务器
  3. 设置tomcat服务需要管理员权限

安装tomcat作为一个服务

  1. 管理员权限

cd tomcat bin目录

service.bat install Tomcat6.0

  1. 删除一个服务

sc delete Tomcat6.0

项目部署到tomcat下时,访问资源出现了404,原因是项目没有成功部署进来,经排查发现,是tomcat的jdk版本与项目的jdk版本不相符合,将jdk更新为最新的1.8版本,既能够解决filter类导不进tomcat的问题,又能解决最新的mysql出错的问题(最新的mysql需要jdk1.8版本及以上)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值