通过表单提交数据,完成文件上传代码

通过表单提交数据,完成文件上传代码

form表单提交时,大部分情况提交的都是普通文本,但是有的情况下,提交的是二进制文件:如头像、视频、音频、文件等,这中情况下就涉及到了文件上传。
(1)、前端文件上传怎么进行?
<form method="post" enctype="multipart/form-data" action="">
<input type="file" name="xxx"/>
<input type="submit"/>
</form> 
form的提交方式必须声明为post方式,因为get方式的大小限制,但是文件一般都很大;form的表单属性enctype必须声明为multipart/form-data类型,因为这种方式提交的不仅是文件的名字还有文件的二进制数据。
(2)、服务器怎么处理上传的文件
因为提交的数据类型发生改变,所以传统的getParameter()方法不可用,可以使用原始的api   InputStream  in=request.getInputStream();接收到数据,然后根据格式进行解析,取出有效数据,但是算法太过于复杂,所以我们一般采用现成的第三方实现。
导入jar包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
UploadUtils工具类:
import java.util.Random;
import java.util.UUID;

public class UploadUtils {
	/**
	 * 获取文件真实名称
	 * 由于浏览器的不同获取的名称可能为:c:/upload/1.jpg或者1.jpg 
	 * 最终获取的为  1.jpg
	 * @param name 上传上来的文件名称
	 * @return	真实名称
	 */
	public static String getRealName(String name){
		//获取最后一个"/"
		int index = name.lastIndexOf("\\");
		return name.substring(index+1);
	}
	
	
	/**
	 * 获取随机名称
	 * @param realName 真实名称
	 * @return uuid 随机名称
	 */
	public static String getUUIDName(String realName){
		//realname  可能是  1.jpg   也可能是  1
		//获取后缀名
		int index = realName.lastIndexOf(".");
		if(index==-1){
			return UUID.randomUUID().toString().replace("-", "").toUpperCase();
		}else{
			return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
		}
	}
	
	
	/**
	 * 获取文件目录,可以获取256个随机目录
	 * @return 随机目录
	 */
	public static String getDir(){
		String s="0123456789ABCDEF";
		Random r = new Random();
		return "/"+s.charAt(r.nextInt(16))+"/"+s.charAt(r.nextInt(16));
	}
	
	public static void main(String[] args) {
		//String s="G:\\day17-基础加强\\resource\\1.jpg";
		String s="1.jgp";
		String realName = getRealName(s);
		System.out.println(realName);
		
		String uuidName = getUUIDName(realName);
		System.out.println(uuidName);
		
		String dir = getDir();
		System.out.println(dir);
	}
}
添加商品的方法
//添加商品信息
	public void save(HttpServletRequest request, HttpServletResponse response) throws FileUploadException, IOException{
		Map map=new HashMap();
		Product pro=new Product();
		DiskFileItemFactory factory=new DiskFileItemFactory();//创建一个工厂类
		ServletFileUpload fileipload=new ServletFileUpload(factory);//创建一个解析对象
		List<FileItem> fis = fileipload.parseRequest(request);//解析是将上传的每一部分封装为一个FileItem类
		for (FileItem fi : fis) {
			if(fi.isFormField()){
				String name = fi.getFieldName();
				String value = new String(fi.getString().getBytes("iso-8859-1"),"utf-8");//乱码处理
				map.put(name, value);
			}else{
				//获取图片的键与对应的图片名
				String name = fi.getFieldName();
				String value = fi.getName();
				//获取到存储到项目中存放图片目录的真实的路径
				String realPath = request.getServletContext().getRealPath("/products");
				//目录优化(为了加载更快,把图片放在不同的文件夹中)
				String dir = UploadUtils.getDir();
				//存放文件的目录
				File imgdir=new File(realPath+dir);
				if(!imgdir.exists()){
					imgdir.mkdirs();
				}
				
				//文件名
				String filename=UploadUtils.getUUIDName(value);
				File file=new File(imgdir, filename);
				if(!file.exists()){
					file.createNewFile();
				}
				//开始读与写文件
				InputStream in = fi.getInputStream();
				FileOutputStream out=new FileOutputStream(file);
				IOUtils.copy(in, out);
				IOUtils.closeQuietly(in);
				IOUtils.closeQuietly(out);
				//将文件名存入map中
				String imName="products"+dir+"/"+filename;
				map.put(name, imName);
				
			}
		}
		MyBeanUtils.getObject(pro, map);
		pro.setPid(UUIDUtils.getUUID());
		Category cat=new Category();
		String cid =(String) map.get("cid");
		cat.setCid(cid);
		pro.setCat(cat);
		pro.setPdate(new Date());
		try {
			ps.save(pro);//保存商品的方法,此处省略,就是把pro中的数据存入数据库
			response.getWriter().write("yes");
		} catch (SQLException e) {
			e.printStackTrace();
			response.getWriter().write("no");
		}
		
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值