文件上传的最基本实现
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);
}
}