实现上传

文件上传的最基本实现

package com.itheima;

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

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

public class FileuploadServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		try {
			//接受上传文件
			
			//1、创建磁盘文件项工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//2、创建文件上传的核心类
			ServletFileUpload upload = new ServletFileUpload(factory);
			
			//3、解析request---获得文件项集合
			List<FileItem> parseRequest = upload.parseRequest(request);

			//4、遍历文件项集合
			for(FileItem item : parseRequest){
				//5、判断普通表单项/文件上传项
				boolean formField = item.isFormField();//是否是一个普通表单项
				if(formField){
					//普通表单项
					String fieldName = item.getFieldName();
					String fieldValue = item.getString();
					System.out.println(fieldName+":"+fieldValue);
				}else{
					//文件上传项
					//获得上传文件的名称
					String fileName = item.getName();
					//获得上传文件的内容
					InputStream in = item.getInputStream();
					//将in中的数据拷贝服务器上
					String path = this.getServletContext().getRealPath("upload");
					OutputStream out = new FileOutputStream(path+"/"+fileName);
					int len = 0;
					byte[] buffer = new byte[1024];
					while((len=in.read(buffer))>0){
						out.write(buffer, 0, len);
					}
					
					in.close();
					out.close();
				}
			}
			
			
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
		
		
		
	}

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

 

一、实现上传的步骤:

1_导入commons-fileupload-1.2.1.rar之后

2_执行很简单的3行语句,

3_获取到一个集合(<FileItem>对象)

   将每对分割线中间的内容封装在FileItem对象上.

 

二、具体代码:

package cn.itcast.store.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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.beanutils.BeanUtils;
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;

import cn.itcast.store.domain.User;

public class ServletDemo extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//MAP目的:携带数据{username<==>tom,password<==>1234,userhead<==>/images/11.bmp}
		Map<String,String> map=new HashMap<String,String>();
		//目的:携带数据,向sercie,dao传递
		User user=new User();
		
		try {
			//下面三行代码功能:通过request.getInputStrem(),获取到请求体的全部内容
			//进行解析,将没对分割线中的内容封装在了FileItem对象中
			DiskFileItemFactory fac=new DiskFileItemFactory();
			ServletFileUpload upload=new ServletFileUpload(fac);	
			List<FileItem> list=upload.parseRequest(request);
			//4_遍历集合
			for(FileItem item:list){
				if(item.isFormField()){
					//5_如果当前的FileItem对象是普通项
					//将普通项上name属性的值作为键,将获取到的内容作为值,放入MAP中
					//{username<==>tom,password<==>1234}
					map.put( item.getFieldName(), item.getString("utf-8"));
				}else{
					//6_如果当前的FileItem对象是上传项
					//通过FileItem获取到输入流对象,通过输入流可以获取到图片二进制数据
					//在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)
					//建立和空文件对应的输出流
					// 将输入流中的数据刷到输出流中
					//释放资源
					//向map中存入一个键值对的数据 userhead<===> /image/11.bmp
					//{username<==>tom,password<==>1234,userhead<===>image/11.bmp}

					//通过FileItem获取到输入流对象,通过输入流可以获取到图片的二进制数据
					InputStream is=item.getInputStream();
					String realPath=getServletContext().getRealPath("/image/img");
					//在服务端创建一个空文件(后缀必须和上传到服务端的文件名后缀一致)
					File file=new File(realPath,item.getName());
					if(!file.exists()){
						file.createNewFile();
					}
					//建立和空文件对应的输出流
					OutputStream os=new FileOutputStream(file);
					// 将输入流中的数据刷到输出流中
					//释放资源
					IOUtils.copy(is, os);
					IOUtils.closeQuietly(is);
					IOUtils.closeQuietly(os);
					//向map中存入一个键值对的数据 userhead<===> /image/11.bmp
					map.put("userhead", "/images/img/"+item.getName());
				}
			}

			//7_利用BeanUtils将MAP中的数据填充到user对象上
			BeanUtils.populate(user, map);
			//8_调用servcie_dao将user上携带的数据存入数据仓库,重定向到查询全部商品信息路径
			System.out.println("保存用户数据");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

}

三、上传工具类

package cn.itcast.store.utils;

import java.util.UUID;

public class UploadUtils {
	/**
	 * 获取随机名称
	 * @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 UUIDUtils.getId()+realName.substring(index);
		}
	}
	
	/**
	 * 获取文件真实名称
	 * @param name
	 * @return
	 */
	public static String getRealName(String name){
		// c:/upload/1.jpg    1.jpg
		//获取最后一个"/"
		int index = name.lastIndexOf("\\");
		return name.substring(index+1);
	}
	
	/**
	 * 获取文件目录
	 * @param name 文件名称
	 * @return 目录
	 */
	public static String getDir(String name){
		int i = name.hashCode();
		String hex = Integer.toHexString(i);
		int j=hex.length();
		for(int k=0;k<8-j;k++){
			hex="0"+hex;
		}
		return "/"+hex.charAt(0)+"/"+hex.charAt(1)+"/"+hex.charAt(2)+"/"+hex.charAt(3)+"/"+hex.charAt(4)+"/"+hex.charAt(5)+"/"+hex.charAt(6)+"/"+hex.charAt(7);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值