关闭

黑马day15 文件上传&apche的工具包

标签: 文件上传
548人阅读 评论(0) 收藏 举报
分类:

1.肯定要导入apche的jar包

  

2.要使用的类的介绍..

  2.1DiskFileItemFactory 
public DiskFileItemFactory(int sizeThreshold, java.io.File repository) 

public DiskFileItemFactory()
public void setSizeThreshold(int sizeThreshold) --用来设定内存缓冲区的大小,默认是10k
public void setRepository(java.io.File repository) --设定临时文件夹的大小
  2.2ServletFileUpload
boolean isMultipartContent(HttpServletRequest request) 判断上传表单是否为multipart/form-data类型
List parseRequest(HttpServletRequest request) 解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。 
setFileSizeMax(long fileSizeMax) 设置单个上传文件的最大值
setSizeMax(long sizeMax) 设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding) 设置编码格式,解决上传文件名乱码问题
setProgressListener(ProgressListener pListener) 实时监听文件上传状态

  2.3FileItem
boolean isFormField() 判断FileItem是一个文件上传对象还是普通表单对象

如果是一个普通字段项可以调用:
String   getFieldName()  获得普通表单对象的name属性
String  getString(String encoding) 获得普通表单对象的value属性,可以用encoding进行编码设置

如果是一个文件上传项:
String  getName() 获得上传文件的文件名(有些浏览器会携带客户端路径)
InputStream getInputStream()  获得上传文件的输入流
delete()  在关闭FileItem输入流后,删除临时文件

  文件存放应该注意的问题:
1.upload文件夹和temp文件夹都要放在web-inf目录下保护起来,防止上传入侵和访问其他用户上传资源的问题
2.文件名要拼接uuid保证唯一
3.文件要分目录存储保证同一目录下不要有过多的文件,分目录的算法有很多,介绍了一种根据hash值分目录算法

案例:

1.写一个文件上传的jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body style="text-align: center">
  <h1>文件上传</h1>
  <div align="center">
    <form action="${pageContext.request.contextPath }/servlet/UploadServlet1" enctype="multipart/form-data" method="post">
    	描述信息1:<input type="text" name="description1"/><br>
    	描述信息2:<input type="text" name="description2"/><br>
    	<input type="file" name="file1"/><br>
    	<input type="submit" value="提交"/><br>
    </form>
   </div>
  </body>
</html>
2.要实现文件上传的servlet类(需要在WEB-INF的目录下建立upload和temp文件夹)

package cn.itheima.upload;

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

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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.itheima.utils.IOUtils;

public class UploadServlet1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			// 1.获取文件上传的工厂类
			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setSizeThreshold(1024 * 100);// 设置内存的缓存,如果缓存满了就放到临时文件夹中
			factory.setRepository(new File(this.getServletContext()
					.getRealPath("WEB-INF/temp")));// 设置临时文件夹
			// 2.通过工厂类得到文件上传的核心类
			ServletFileUpload fileUpload = new ServletFileUpload(factory);
			fileUpload.setFileSizeMax(1024 * 1024 * 100);// 设置单个上传文件的大小
			fileUpload.setSizeMax(1024 * 1024 * 300);// 设置文件的总的大小
			fileUpload.setHeaderEncoding("utf-8");// 解决上传文件中文名的乱码问题
			// 3.检查提交的表单enctype类型
			if (!fileUpload.isMultipartContent(request)) {
				throw new RuntimeException("请使用正确的表单类型上传文件");
			}
			// --解析request
			List<FileItem> list = fileUpload.parseRequest(request);
			// --遍历list
			for (FileItem item : list) {
				if (item.isFormField()) {// 是普通输入类型
					String fieldName = item.getFieldName();
					String value = item.getString("utf-8");// 解决普通输入类型的中文乱码问题
					System.out.println(fieldName + ":" + value);
				} else {// 文件上传类型
					String filename = item.getName();// 上传文件的文件名
					String uuid = UUID.randomUUID().toString();
					String uuidname = uuid + "_" + filename;// 上传文件使用uuid之后的文件名
					String str = Integer.toHexString(uuidname.hashCode());// 这里使用hashcode
																			// 进行文件夹的创建
					String path = this.getServletContext().getRealPath(
							"WEB-INF/upload");
					for (char c : str.toCharArray()) {
						path += "/" + c;
					}
					new File(path).mkdirs();// 创建文件夹
					InputStream in = item.getInputStream();
					OutputStream out = new FileOutputStream(new File(path,
							uuidname));
					IOUtils.In2Out(in, out);
					IOUtils.closeIO(in, out);
					item.delete();// 删除临时文件夹
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}

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

}

3.工具类

package cn.itheima.utils;

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

public class IOUtils {
	private IOUtils(){
		
	}
	/**
	 * 读取流中的数据写到输出流中
	 * @param in
	 * @param out
	 * @throws IOException
	 */
	public static void In2Out(InputStream in,OutputStream out) throws IOException{
		int len=0;
		byte b[]=new byte[1024];
		while((len=in.read(b))!=-1){
			out.write(b, 0, len);
		}
	}
	/**
	 * 关闭资源
	 * @param in
	 * @param out
	 */
	public  static void closeIO(InputStream in,OutputStream out){
		if(in!=null){
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				in=null;
			}
		}
		if(out!=null){
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				out=null;
			}
		}
	}
}


运行界面:




当运行完毕后可以在tomcat的WEB-INF的upload目录下...看到


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

网站被黑中毒WebShell木马的解决方案

收到客户的反馈,说运行了一年的网站突然遭到黑客的攻击,系统cpu一直保持在100%,有进程也干不掉,然后客户就进行杀毒了,然后就把所有的exe文件都杀了,然后系统也就很多功能不正常了,数据库的服务也干...
  • huangxiangec
  • huangxiangec
  • 2014-02-13 11:10
  • 9621

java使用Apache工具集实现ftp文件传输

本文主要介绍如何使用Apache工具集commons-net提供的ftp工具实现向ftp服务器上传和下载文件。
  • zleven
  • zleven
  • 2016-12-26 15:50
  • 1609

[web安全] 上传漏洞之绕过上传漏洞

程序员在防止文件上传漏洞时可以分为以下两种: $客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证; $服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展...
  • hitwangpeng
  • hitwangpeng
  • 2015-07-16 16:45
  • 8014

使用apche.commons.fileupload进行文件上传时的工具类解说

一 主要API 1. DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发人员通过这个类来与Apache文件上传组件进行交互。下面介绍Di...
  • aaa1117a8w5s6d
  • aaa1117a8w5s6d
  • 2012-02-22 11:07
  • 827

SSM搭建-SpringMVC 实例文件上传(15)

本文详细讲解了SpringMVC实例单文件上传、多文件上传、文件列表显示、文件下载
  • nimiky
  • nimiky
  • 2016-11-01 19:45
  • 1416

15.springboot实现文件上传

1.介绍即准备工作 spingboot实现文件上传主要是使用thymeleaf支持。这个依赖可以指定页面模板实现页面跳转,可以根据controller返回的字符串跳转到这个字符串指定的页面 (1)...
  • qq_34448345
  • qq_34448345
  • 2017-12-14 17:59
  • 18

Struts2学习笔记(15)-----Struts2文件上传之牛刀小试(上)

文件上传是网络生活中比较常用的一个功能,比如将照片上传到QQ空间,将文件上传到网盘等,我就喜欢将一些珍贵的东西上传到115网盘去,自己永久保存着多好。实现文件上传的技术有很多,今天就来探讨一下用Str...
  • youqishini
  • youqishini
  • 2012-01-06 20:10
  • 1413

25、26、27day-文件上传和下载&ASI&AFN

一、文件上传下载1、小文件下载直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url; 利用NSURLConnection发送一个HTTP请求去下载 ...
  • u011018979
  • u011018979
  • 2017-07-10 11:48
  • 176

day23_文件上传与下载__JavaMail邮件开发

回顾: 一、 监听器 1. 生命周期监听器 ServletRequestListener HttpSessionListener ServletContextListener 2. 属性监...
  • kw7142
  • kw7142
  • 2016-04-09 08:36
  • 280

day20之用Servlet实现文件上传和下载(借助第三方开发包)

 一、文件上传的必要前提: 1、表单的method必须是post的。 2、表单的enctype属性取值必须是multipart/form-data  enctype属性作用:指示请求消息正...
  • tangliuqing
  • tangliuqing
  • 2014-03-19 21:56
  • 860
    个人资料
    • 访问:199001次
    • 积分:4356
    • 等级:
    • 排名:第8004名
    • 原创:242篇
    • 转载:4篇
    • 译文:0篇
    • 评论:38条
    友情链接