Java 多文件上传存储到不同的路径及某上传框中未选择上传文件的处理方法
2014-07-04 14:35
597 查看
近期写代码,要求多文件同时上传,但是每个文件要求上传到不同的路径去,研究了下,终于搞定,当然中间还遇到如果有某个上传框未选择文件出现的FileUploadException异常的处理办法(如果不管的话程序到这里就停止了,导致后边的文件无法继续上传)。
先看页面:
点击从目录选择就会出现浏览框选择文件,点击修改设置就会提交表单,当然这里使用的依旧是<input type="file">上传的,可能有些人看着感觉不像,原因是使用了js改了下,嘿嘿嘿
来上Java代码
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
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.log4j.Logger;
public class UploadService {
private static final Logger logger = Logger.getLogger(UploadService.class);
private static String uploadPath = null;// 上传文件的目录
private static String tempPath = null; // 临时文件目录
private static File uploadFile = null;
private static File tempPathFile = null;
private static int sizeThreshold = 1024*2000;
private static int sizeMax = 50*1024*1024;
//初始化
static{
tempPath = "E://g";
tempPathFile = new File(tempPath);
if (!tempPathFile.exists()) {
tempPathFile.mkdirs();
}
}
public static boolean upload(HttpServletRequest request){
logger.info("uploading a file");
boolean flag = true;
//检查输入请求是否为multipart表单数据。
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//若果是的话
if(isMultipart){
/**为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。**/
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(sizeThreshold); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempPathFile);// 设置缓冲区目录
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");//解决文件乱码问题
upload.setSizeMax(sizeMax);// 设置最大文件尺寸
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> itr = items.iterator();//所有的表单项
//保存文件
while (itr.hasNext()){
FileItem item = (FileItem) itr.next();//循环获得每个表单项
if (!item.isFormField()){//如果是文件类型
String name = item.getName();//获得文件名 包括路径啊
if(name!=null){
File fullFile=new File(item.getName());
//获取该上传流在表单中name的属性值<input type="file" name="mac">取出来就是mac
String nameA=item.getFieldName();
// !!!!!!!!! 达到根据不同的上传框上传到不同的路径,这里把存储路径直接弄成了和mac一样了,大家可以根据自己的要求随意改
uploadPath = "E://"+nameA;
uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdirs();
}
// 如果某个上传框没有选择文件上传就直接执行else
if(!fullFile.getName().equals("")){
File savedFile=new File(uploadPath,fullFile.getName());
item.write(savedFile);
logger.info("upload a file for "+nameA+" successfully");
}else{
logger.info("no file upload for "+nameA);
}
}
}
}
}catch(FileNotFoundException e){
// 这个异常其实在上面已经解决了,估计没机会出现了,哈哈哈
logger.info("no file upload for ");
}
catch (FileUploadException e) {
flag = false;
logger.info("error occured when uploading a file ");
e.printStackTrace();
}catch (Exception e) {
flag = false;
logger.info("error occured!! when uploading a file ");
e.printStackTrace();
}
}else{
flag = false;
logger.info("the enctype must be multipart/form-data");
System.out.println("the enctype must be multipart/form-data");
}
return flag;
}
}
嗯嗯,看代码吧,奥妙都在里面了
先看页面:
点击从目录选择就会出现浏览框选择文件,点击修改设置就会提交表单,当然这里使用的依旧是<input type="file">上传的,可能有些人看着感觉不像,原因是使用了js改了下,嘿嘿嘿
来上Java代码
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
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.log4j.Logger;
public class UploadService {
private static final Logger logger = Logger.getLogger(UploadService.class);
private static String uploadPath = null;// 上传文件的目录
private static String tempPath = null; // 临时文件目录
private static File uploadFile = null;
private static File tempPathFile = null;
private static int sizeThreshold = 1024*2000;
private static int sizeMax = 50*1024*1024;
//初始化
static{
tempPath = "E://g";
tempPathFile = new File(tempPath);
if (!tempPathFile.exists()) {
tempPathFile.mkdirs();
}
}
public static boolean upload(HttpServletRequest request){
logger.info("uploading a file");
boolean flag = true;
//检查输入请求是否为multipart表单数据。
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//若果是的话
if(isMultipart){
/**为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。**/
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(sizeThreshold); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempPathFile);// 设置缓冲区目录
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");//解决文件乱码问题
upload.setSizeMax(sizeMax);// 设置最大文件尺寸
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> itr = items.iterator();//所有的表单项
//保存文件
while (itr.hasNext()){
FileItem item = (FileItem) itr.next();//循环获得每个表单项
if (!item.isFormField()){//如果是文件类型
String name = item.getName();//获得文件名 包括路径啊
if(name!=null){
File fullFile=new File(item.getName());
//获取该上传流在表单中name的属性值<input type="file" name="mac">取出来就是mac
String nameA=item.getFieldName();
// !!!!!!!!! 达到根据不同的上传框上传到不同的路径,这里把存储路径直接弄成了和mac一样了,大家可以根据自己的要求随意改
uploadPath = "E://"+nameA;
uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdirs();
}
// 如果某个上传框没有选择文件上传就直接执行else
if(!fullFile.getName().equals("")){
File savedFile=new File(uploadPath,fullFile.getName());
item.write(savedFile);
logger.info("upload a file for "+nameA+" successfully");
}else{
logger.info("no file upload for "+nameA);
}
}
}
}
}catch(FileNotFoundException e){
// 这个异常其实在上面已经解决了,估计没机会出现了,哈哈哈
logger.info("no file upload for ");
}
catch (FileUploadException e) {
flag = false;
logger.info("error occured when uploading a file ");
e.printStackTrace();
}catch (Exception e) {
flag = false;
logger.info("error occured!! when uploading a file ");
e.printStackTrace();
}
}else{
flag = false;
logger.info("the enctype must be multipart/form-data");
System.out.println("the enctype must be multipart/form-data");
}
return flag;
}
}
嗯嗯,看代码吧,奥妙都在里面了
相关文章推荐
- Java+Selenium3方法篇38-AutoIt工具处理文件上传
- Java+Selenium3方法篇37-Robot类处理文件上传
- 关于小程序&VUE上传文件的java处理方法
- 在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了
- LabVIEW中在编辑环境和运行环境下文件保存的路径问题以及发生不同界面文件保存在同一文档中发生覆盖时的处理方法
- java 实现html5多文件选择上传_h5多文件上传_ajax异步多文件上传_java处理多文件上传
- java上传文件的路径在Windows和liunx中不同
- java 读取文件路径空格、"+"和中文的处理方法
- Java中关于文件上传的基本处理方法Commons-FileUpload
- JAVA 文件上传后台判断浏览器的类型以及JDK1.5和1.6处理的不同
- java中得到当前路径和Properties文件的方法
- Java程序文件路径中有空格的处理
- 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍
- Java在不同环境下获取当前路径的方法
- ASP.NET 2.0中母版页中引用文件路径的问题(对原处理方法中的bug进行了修改)
- java 处理 文件的大部分方法
- 获取Java文件路径的两种方法
- 在 action 的 java 里面获得应用 WEB-INF 下面的文件的路径方法
- 关于applet写入文件的处理 选择自 javaduke 的 Blog
- Java在不同环境下获取当前路径的方法