首页 > Web开发 > 详细

servlet上传和文件转成流

时间:2015-12-30 19:37:07      阅读:179      评论:0      收藏:0      [点我收藏+]
import java.io.File;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

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.commons.lang3.StringUtils;

public class FileUpload {

/**
* 
* @Title: upload 
* @Description: TODO(文件上传保存的本地,可同时上传多个文件) 
* @param @param request    
* @param @param savePath    文件要保存的路径
* @param @param tempPath    文件上传时的缓存路径
* @param @return
* @param @throws FileUploadException
* @param @throws IOException 设定文件 
* @return ArrayList<HashMap> HashMap中 包含oldName(文件上传时的名称),newName(文件保存在服务器的名称),savePath(文件保存路径)
* @throws AppException 
* @throws 
* @author liubf
* @date 2015年12月28日 上午11:01:12
*/
public static ArrayList<HashMap> upload(HttpServletRequest request,String savePath,String tempPath)
throws FileUploadException, IOException, AppException {
ArrayList<HashMap> saveInfoList = new ArrayList<HashMap>();//保存上传文件信息
SimpleDateFormat DateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
String timeStr = DateFormat.format(new Date());
File repository = new File(tempPath);//缓存文件
//创建一个磁盘文件工厂
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(5*1024*1024, repository);//缓存大小为5M
ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
fileUpload.setSizeMax(10*1024*1024);//设置上传文件的大小
fileUpload.setHeaderEncoding("utf-8");//设置编码
try {
List<FileItem> fileList = fileUpload.parseRequest(request);
for(FileItem item : fileList){
HashMap<String, Object> fileInfoMap = new HashMap<String,Object>();
if(item.isFormField()){//如果是表单数据,暂不处理
}else{//如果是文件
String fileName = item.getName();//上传时文件的名称
if(StringUtils.isEmpty(fileName)){
throw new AppException("上传文件不能为空!");
}
int index = fileName.lastIndexOf("\\");
if(-1 != index    ){
fileName = fileName.substring(index+1);
}
InputStream inputStream = item.getInputStream();//输入流
Random random = new Random();
String saveName = timeStr+random.nextInt(10000)+fileName.substring(fileName.lastIndexOf("."));//文件保存的名字
File fileDir = new File(savePath);
fileDir.mkdirs();
File saveFile = new File(fileDir, saveName);
FileOutputStream outputStream = new FileOutputStream(saveFile);
// 输入流转换成输出流输出到本地文件
int len = 0;
byte[] b = new byte[1024];
while((len = inputStream.read(b))!=-1){
outputStream.write(b, 0, len);
}
inputStream.close();
outputStream.close();
//添加上传文件的信息以返回
fileInfoMap.put("oldName", fileName);
fileInfoMap.put("newName", saveName);
fileInfoMap.put("savePath", savePath+"/"+saveName);
fileInfoMap.put("suffix", fileName.substring(fileName.lastIndexOf(".")));
saveInfoList.add(fileInfoMap);
}
item.delete();
}
} catch (FileUploadException e) {
System.out.println("文件上传时发生错误!错误原因:" +e.getMessage());
throw e;
} catch (IOException e) {
System.out.println("读取文件信息时发生错误!错误原因:" +e.getMessage());
throw e;
} 
return saveInfoList;
}


/**
* 
* @Title: fileToStream 
* @Description: TODO(上传文件转换成输入流流,一次仅可以上传一个文件) 
* @param @param request
* @param @param tempPath    文件缓存路径
* @param @return
* @param @throws IOException 设定文件 
* @return ArrayList<HashMap> HashMap中 包含oldName(文件上传时的名称),inputStream(文件转换为输入流),suffix(文件后缀名)
* @throws AppException 
* @throws FileUploadException 
* @throws 
* @author liubf
* @date 2015年12月28日 上午11:04:25
*/
public static HashMap<String, Object> fileToStream(HttpServletRequest request,String tempPath)
throws Exception {
InputStream inputStream = null;
HashMap<String, Object> resultMap = new HashMap<String, Object>();
File repository = new File(tempPath);//缓存文件
//创建一个磁盘文件工厂
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(5*1024*1024, repository);//缓存大小为5M
ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
fileUpload.setSizeMax(10*1024*1024);//设置上传文件的大小
fileUpload.setHeaderEncoding("utf-8");//设置编码
try {
List<FileItem> fileList = fileUpload.parseRequest(request);
short fileSum = 0;
for(FileItem item : fileList){
HashMap<String, Object> fileInfoMap = new HashMap<String,Object>();
if(item.isFormField()){//如果是表单数据,暂不处理
}else{//如果是文件
fileSum++;
String fileName = item.getName();
if(StringUtils.isEmpty(fileName)){
throw new AppException("上传文件不能为空!");
}
int index = fileName.lastIndexOf("\\");
if(-1 != index    ){
fileName = fileName.substring(index+1);
}
inputStream = item.getInputStream();//输入流
resultMap.put("oldName", fileName);
resultMap.put("inputStream", inputStream);
resultMap.put("suffix", fileName.substring(fileName.lastIndexOf(".")));
}
item.delete();
if(fileSum>1){
throw new AppException("上传的文件不能多于一个!");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
System.out.println("读取文件信息时发生错误!");
throw e;
}
return resultMap;
}
}

 

servlet上传和文件转成流

原文:http://www.cnblogs.com/mr-level/p/5089776.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!