11_upload

1 概念

文件上传:把客户端的文件 上传到服务器端::

2 对jsp要求

1:请求方式必须是post:
2:表单必须加属性:enctype=multipart/form-data 
3:表单必须有文件域:input type=file
<form  action="<c:url value='/day07/upload01.do'/>" method="post"  enctype="multipart/form-data">
       用户名:<input type="text" name="uname" value="韩梅梅"/><br/>
       密码:<input type="text" name="upwd" value="123"/><br/>
       年龄:<input type="text" name="uage" value="19"/><br/>
       头像:<input type="file" name="uphoto"/><br/>
       <input type="submit"  value="注册"/><br/>
</form>

3 对servlet分析

package com.zhiyou100_07.upload;

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

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

public class Demo01Upload extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1 设置编码集 获取请求参数
		//2 访问数据库
		//3 设置域属性
		//4 选择跳转的页面
		
		//注意1: enctype="multipart/form-data"是多部件表单:此表单的getParameter方法无效
		//enctype="multipart/form-data"是多部件表单: 只能用getInputStream方法
		req.setCharacterEncoding("utf-8");
		//String uname=req.getParameter("uname");
		//System.out.println("uname="+uname);
		InputStream in=req.getInputStream();
		byte[] arr=new byte[1024];
		int n;
		while((n=in.read(arr))!=-1){
			System.out.print(new String(arr, 0, n));
		}
		//获取的信息分析
		//每个组件对应四部分
//		-----------------------------283509785435143822711522397  //分割符
//		Content-Disposition: form-data; name="uname"              //组件类型+组件name
//                                                                //空格
//		闊╂姊?                                                   //组件的数据
		
		
	}
    ...
}

4 servlet的正确写法

package com.zhiyou100_07.upload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

public class Demo02Upload extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1 设置编码集 获取请求参数
		//2 访问数据库
		//3 设置域属性
		//4 选择跳转的页面
		
		req.setCharacterEncoding("utf-8");
		User user=new User();
		DiskFileItemFactory factory=new DiskFileItemFactory();//创建工厂对象
		ServletFileUpload upload=new ServletFileUpload(factory);//获取多部件表单的解析器
		Map<String, String> map=new HashMap<String,String>();
		
		//获取imgs的路径
	    File fileImgs=new File(req.getServletContext().getRealPath("/imgs"));
		try {
			List<FileItem>  list=upload.parseRequest(req);//解析请求对象 获取list集合:每个元素对应一个FileItem对象
//			for (FileItem fileItem : list) {
//				System.out.println("获取文件域提交的文件名:getName="+fileItem.getName());
//				System.out.println("获取组件名:getFieldName="+fileItem.getFieldName());
//				System.out.println("获取组件数据:getString="+fileItem.getString());
//				System.out.println("获取组件数据并设置编码集:getString(charset)="+fileItem.getString("utf-8"));
//				System.out.println("片段是否为普通组件:isFormField="+fileItem.isFormField());
//				System.out.println("获取组件数据所占的字节数:getSize="+fileItem.getSize());
//				System.out.println();
//			}
			for (FileItem fileItem : list) {
				String name=fileItem.getFieldName();//获取组件名字
				if(fileItem.isFormField()){//是普通组件::只关心组件名+组件值
					 String value=fileItem.getString("utf-8");
					 map.put(name, value);
				}else{//是文件域:::关心组件名+文件名字+文件对应的输入流
					//把提交的文件保存到当前项目的imgs文件夹中
					//定义目的文件的名字
					String newFileName=System.currentTimeMillis()+"_"+fileItem.getName();
					File muDi=new File(fileImgs,newFileName);
					System.out.println(muDi.getAbsolutePath());
					InputStream in=fileItem.getInputStream();
					FileOutputStream out=new FileOutputStream(muDi);
					IOUtils.copy(in, out);
//					byte[] arr=new byte[1024*10];
//					int n;
//					// arr=new byte[fileItem.getSize()];
//					while((n=in.read(arr))!=-1){
//						out.write(arr, 0, n);
//					}
					out.close();
					
					map.put(name, newFileName);
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		//把map中的数据拿出来 赋值给user对象的属性
		user.setUage(Integer.parseInt(map.get("uage")));
		user.setUname(map.get("uname"));
		user.setUpwd(map.get("upwd"));
		user.setUphotoPath(map.get("uphoto"));
		System.out.println(user);
		//注意:文件上传的目录不是eclipse的workspace下的imgs中  而是tomcat的webapps下
		
	}
    ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值