apache上传下载

使用apache-fileupload处理文件上传

框架:是指将用户经常处理的业务进行一个代码封装。让用户可以方便的调用。
目前文件上传的(框架)组件:
Apache----fileupload -
Orialiy – COS – 2008() -
Jsp-smart-upload – 200M。

用fileupload上传文件:

需要导入第三方包:
Apache-fileupload.jar – 文件上传核心包。
Apache-commons-io.jar – 这个包是fileupload的依赖包。同时又是一个工具包。
核心类:
DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。
ServletFileUpload - 文件上传的核心类,此类接收request,并解析reqeust。

servletfileUpload.parseRequest(requdest) - List<FileItem>
 
一个FileItem就是一个标识的开始:---------243243242342 到 ------------------245243523452—就是一个FileItem

第一步:导入包


第二步:书写一个servlet完成doPost方法

特别注意 form一定要写规范 否则 会报错  input一定要给名字 就算没用
<form action="<c:url value='/UpServlet'/>" method="post" enctype="multipart/form-data">
    	File1:<input type="file" name="txt"><br/>
    	<input type="submit"/>
    </form>


如果你没有为DiskFileItemFactory 指定临时目录 就用系统的目录
@Test
	public void test(){
		String path =System.getProperty("java.io.tmpdir");
		System.err.println(path);
	}

输出结果C:\Users\ADMINI~1\AppData\Local\Temp\
获取系统所有的属性
@Test
	public void temp(){
		Properties prop =System.getProperties();
		Enumeration<Object>  en = prop.keys();
		while(en.hasMoreElements()){
			String key = (String) en.nextElement();
			System.err.println(key+"====="+prop.getProperty(key));
		}
	}

/**
 * DiskFileItemFactory构造的两个参数
 * 	第一个参数:sizeThreadHold - 设置缓存(内存)保存多少字节数据,默认为10K
 * 			   如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。
 * 			 如果一个文件大于10K,就需要将文件先保存到临时目录中去。
 * 第二个参数 File 是指临时目录位置
 *
 */
public class Up2Servlet extends HttpServlet {
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("UTf-8");
		//获取项目的路径
		String path = getServletContext().getRealPath("/up");
		//第一步声明diskfileitemfactory工厂类,用于在指的磁盘上设置一个临时目录
		DiskFileItemFactory disk = 
				new DiskFileItemFactory(1024*10,new File("d:/a"));
		//第二步:声明ServletFileUpoload,接收上面的临时目录
		ServletFileUpload up = new ServletFileUpload(disk);
		//第三步:解析request
		try {
			List<FileItem> list =  up.parseRequest(req);
			//如果就一个文件
			FileItem file = list.get(0);
			//获取文件名,带路径
			String fileName = file.getName();
			fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
			//获取文件的类型
			String fileType = file.getContentType();
			//获取文件的字节码
			InputStream in = file.getInputStream();
			//声明输出字节流
			OutputStream out = new FileOutputStream(path+"/"+fileName);
			//文件copy
			byte[] b = new byte[1024];
			int len = 0;
			while((len=in.read(b))!=-1){
				out.write(b,0,len);
			}
			out.close();
			
			long size = file.getInputStream().available();
			
			//删除上传的临时文件
			file.delete();
			//显示数据
			resp.setContentType("text/html;charset=UTf-8");
			PrintWriter op = resp.getWriter();
			op.print("文件上传成功<br/>文件名:"+fileName);
			op.print("<br/>文件类型:"+fileType);
			op.print("<br/>文件大小(bytes)"+size);
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

上传多个文件

第一步:修改页面的表单为多个input type=”file”

<form action="<c:url value='/Up3Servlet'/>" method="post" enctype="multipart/form-data">
    	File1:<input type="file" name="txt"><br/>
    	File2:<input type="file" name="txt"><br/>
    	<input type="submit"/>
    </form>
public class Up2Servlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String path = getServletContext().getRealPath("/up");
		// 声明disk
		DiskFileItemFactory disk = new DiskFileItemFactory();
		disk.setSizeThreshold(1024 * 1024);
		disk.setRepository(new File("f:/a"));
		// 声明解析requst的servlet
		ServletFileUpload up = new ServletFileUpload(disk);
		try {
			// 解析requst
			List<FileItem> list = up.parseRequest(request);
			// 声明一个list<map>封装上传的文件的数据
			List<Map<String, String>> ups = new ArrayList<Map<String, String>>();
			for (FileItem file : list) {
				Map<String, String> mm = new HashMap<String, String>();
				// 获取文件名
				String fileName = file.getName();
				fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
				String fileType = file.getContentType();
				InputStream in = file.getInputStream();
				int size = in.available();
				// 使用工具类
				FileUtils.copyInputStreamToFile(in, new File(path + "/"
						+ fileName));
				mm.put("fileName", fileName);
				mm.put("fileType", fileType);
				mm.put("size", "" + size);

				ups.add(mm);
				file.delete();
			}
			request.setAttribute("ups", ups);
			// 转发
			request.getRequestDispatcher("/jsps/show.jsp").forward(request,
					response);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

动态上传多个文件

       核心问题:

     在页面上应该可以控制<input type=”file”/>多少。

   

第一步:用table的格式化

  <form name="xx" action="<c:url value='/Up3Servlet'/>" method="post" enctype="multipart/form-data">
    <table id="tb" border="1">
    	<tr>
    		<td>
    			File:
    		</td>
    		<td>
    			<input type="file" name="file">
    			<button οnclick="_del(this);">删除</button>
    		</td>
    	</tr>
    </table>
    <br/>
	<input type="button" οnclick="_submit();" value="上传">
	<input οnclick="_add();" type="button" value="增加">
	</form>
  </body>
  <script type="text/javascript">
  	function _add(){
  		var tb = document.getElementById("tb");
  		//写入一行
  		var tr = tb.insertRow();
  		//写入列
  		var td = tr.insertCell();
  		//写入数据
  		td.innerHTML="File:";
  		//再声明一个新的td
  		var td2 = tr.insertCell();
  		//写入一个input
  		td2.innerHTML='<input type="file" name="file"/><button οnclick="_del(this);">删除</button>';
  	}
  	function _del(btn){
  		var tr = btn.parentNode.parentNode;
  		//alert(tr.tagName);
  		//获取tr在table中的下标
  		var index = tr.rowIndex;
  		//删除
  		var tb = document.getElementById("tb");
  		tb.deleteRow(index);
  	}
  	function _submit(){
  		//遍历所的有文件
  		var files = document.getElementsByName("file");
  		if(files.length==0){
  			alert("没有可以上传的文件");
  			return false;
  		}
  		for(var i=0;i<files.length;i++){
  			if(files[i].value==""){
  				alert("第"+(i+1)+"个文件不能为空");
  				return false;
  			}
  		}
		document.forms['xx'].submit();
  	}
  </script>
</html>

解决文件的重名的问题

public class UpImgServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String path = getServletContext().getRealPath("/up");
		DiskFileItemFactory disk = 
				new DiskFileItemFactory(1024*10,new File("d:/a"));
		ServletFileUpload up = new ServletFileUpload(disk);
		try{
			List<FileItem> list = up.parseRequest(request);
			//只接收图片*.jpg-iamge/jpege.,bmp/imge/bmp,png,
			List<String> imgs = new ArrayList<String>();
			for(FileItem file :list){
				if(file.getContentType().contains("image/")){
					String fileName = file.getName();
					fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
					
					//获取扩展
					String extName = fileName.substring(fileName.lastIndexOf("."));//.jpg
					//UUID
					String uuid = UUID.randomUUID().toString().replace("-", "");
					//新名称
					String newName = uuid+extName;
					
					
					FileUtils.copyInputStreamToFile(file.getInputStream(),
							new File(path+"/"+newName));
					//放到list
					imgs.add(newName);
				}
				file.delete();
			}
			request.setAttribute("imgs",imgs);
			request.getRequestDispatcher("/jsps/imgs.jsp").forward(request, response);
		}catch(Exception e){
			e.printStackTrace();
		}
	
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值