上传文件其实就是拿到上传的文件,然后把他存入指定的本机文件夹
基本实现
JSP要求:
- 必须是post请求
- 编码类型,必须改成 enctype="multipart/form-data"
<form method="post" action="${pageContext.request.contextPath }/AdminCategory?action=upload" enctype="multipart/form-data">
<input type="text" name="name" value="asd">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
java获取文件字节流
注意不要导成tomcat的包
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
//不要导成tomcat的包
protected void upload(HttpServletRequest request, HttpServletResponse response) throws Exception {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
//得到表单的所有数据
List<FileItem> items = upload.parseRequest(request);
for (FileItem fileItem : items) {
if(fileItem.isFormField())//是否是文件
{
String name=fileItem.getFieldName();//提交上来的字段名
String value=fileItem.getString("utf-8");//获取普通的value
}else//如果是文件
{
fileItem.getFieldName();//获取字段(name=)名字
String Filename = fileItem.getName();//获取文件名字(全路径和名字和后缀)
System.out.println("拿到的文件getName:"+ Filename);
InputStream is = fileItem.getInputStream();//获取文件内容
//存放到指定文件夹
//获取要存放文件夹的路径(tomcat项目路径下)
String imgPash = getServletContext().getRealPath("UserImage");
System.out.println("文件存放在:"+imgPash);
File file = new File(imgPash);
if(!file.exists())//如果目录文件夹不存在
{
file.mkdirs();//创建目录
}
//截取拿到的全路径,只要名字和后缀
Filename = Filename.substring(Filename.lastIndexOf("/")+1);
System.out.println("截取后的文件存放路径:" +Filename);
//传入文件名字和文件夹
File file1 =new File(imgPash,Filename);
FileOutputStream os = new FileOutputStream(file1);
//把is的文件copy到os
IOUtils.copy(is, os);
//关闭资源
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
}
}
改进不重名
//上面的37行进行改进(生成唯一的名字)
Filename = Filename.substring(Filename.lastIndexOf("/")+1);
//只截取文件的后缀如a.txt 只要.txt
Filename=Filename.substring(Filename.lastIndexOf("."));
System.out.println("只有后缀:"+Filename);
////生成唯一名字(防止重名)
Filename=uuidUtils.getID()+Filename;
改进文件过多的放在一个文件夹
添加随机生成8级文件夹的utils
package com.itheima.Utils;
import java.util.UUID;
public class UploadUtils {
/**
* 获取随机名称
* @param realName 真实名称
* @return uuid
* 1111.bmp
* q2433124321412421.bmp
*/
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);
}
}
/**
* 11.bmp
* 获取文件真实名称
* @param name
* @return
*/
public static String getRealName(String name){
// c:/upload/11.bmp 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);
}
@SuppressWarnings("unused")
public static void main(String[] args) {
//String path=getDir("1432142142142.bmp");
//System.out.println(path);
//String val=getUUIDName("11.bmp");
//System.out.println(val);
String val=getRealName("c:\1\2\1.bmp");
System.out.println(val);
}
}
最终版
protected void upload(HttpServletRequest request, HttpServletResponse response) throws Exception {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
//得到表单的所有数据
List<FileItem> items = upload.parseRequest(request);
for (FileItem fileItem : items) {
if(fileItem.isFormField())//是否是文件
{
String name=fileItem.getFieldName();//提交上来的字段名
String value=fileItem.getString("utf-8");//获取普通的value
}else//如果是文件
{
fileItem.getFieldName();//获取字段(name=)名字
String Filename = fileItem.getName();//获取文件名字(全路径和名字和后缀)
System.out.println("拿到的文件getName:"+ Filename);
InputStream is = fileItem.getInputStream();//获取文件内容
//存放到指定文件夹
//获取要存放文件夹的路径(tomcat项目路径下)
String imgPash = getServletContext().getRealPath("UserImage"+UploadUtils.getDir(Filename));//添加文件夹
System.out.println("文件存放在:"+imgPash);
File file = new File(imgPash);
if(!file.exists())//如果目录文件夹不存在
{
file.mkdirs();//创建目录
}
//截取拿到的全路径,只要名字和后缀
Filename = Filename.substring(Filename.lastIndexOf("/")+1);
System.out.println("截取后的文件存放路径:" +Filename);
//生成唯一名字(防止重名)
Filename= Filename.substring(Filename.lastIndexOf("."));
System.out.println("只有后缀:"+Filename);
//添加名字
Filename=uuidUtils.getID()+Filename;
//传入文件名字和文件夹
File file1 =new File(imgPash,Filename);
FileOutputStream os = new FileOutputStream(file1);
//把is的文件copy到os
IOUtils.copy(is, os);
//关闭资源
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
}
}
生成文件夹和文件名称util
import java.util.UUID;
public class UploadUtils {
/**
* 获取随机名称
* @param realName 真实名称
* @return uuid
* 1111.bmp
* q2433124321412421.bmp
*/
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);
}
}
/**
* 11.bmp
* 获取文件真实名称
* @param name
* @return
*/
public static String getRealName(String name){
// c:/upload/11.bmp 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);
}
@SuppressWarnings("unused")
public static void main(String[] args) {
//String path=getDir("1432142142142.bmp");
//System.out.println(path);
//String val=getUUIDName("11.bmp");
//System.out.println(val);
String val=getRealName("c:\1\2\1.bmp");
System.out.println(val);
}
}