黑马程序员技术交流社区
标题:
文件上传小记
[打印本页]
作者:
hejinzhong
时间:
2014-9-12 21:18
标题:
文件上传小记
public class FileLoad extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//先判断是否是上传操作----------#1
if(!ServletFileUpload.isMultipartContent(request)){
throw new RuntimeException("非上传操作");
}
try {
//----------------------------------------------------------------------
//建立一个工厂,并设置参数(文件位置和是否缓存)
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置文件大于6M则进行缓存
diskFileItemFactory.setSizeThreshold(1024*1024*6);
/*
*这个是返回该文件在服务器中的实际路径,其中/是指当前项目路径。
*目的:建立一个临时文件夹
*/
File tempFile = new File(this.getServletContext().getRealPath("/temp"));
if(!tempFile.exists()){
tempFile.mkdir();
}
//设置的是上传过程中临时文件存放位置
diskFileItemFactory.setRepository(tempFile);
//----------------------------------------------------------------------
//建立核心类,将工厂传进去
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//设置FileItem头中编码方式,上传文件名
servletFileUpload.setHeaderEncoding("UTF-8");
//开始解析
List<FileItem> parseRequest = servletFileUpload.parseRequest(request);
//处理解析结果
for (FileItem fileItem : parseRequest) {
if(fileItem.isFormField()){
System.out.println(fileItem.getName()+":"+fileItem.getString("UTF-8"));
}else{
/*
* 获取上传的名,并作处理
* 由于不同的浏览且传送过来的路径方式不同
*/
String fileName = fileItem.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
//目录分级处理(工具类)
String subDir = DirUtils.getSubDir(fileName);
//得到文件存储的位置
File fileDir = new File(this.getServletContext().getRealPath("/WEB-INF/upload"),subDir);
if( ! fileDir.exists()){
fileDir.mkdirs();//这里创建多级目录
}
//获取流,将其内容写去文件中,
FileUtils.copyInputStreamToFile(fileItem.getInputStream(), new File(fileDir,fileName));
fileItem.delete();
}
}
} catch (FileUploadException e) {
throw new RuntimeException(e);
}
}
}
class DirUtils{
//根据哈希值对文件进行目录的分级
public static String getSubDir(String fileName){
int fileCode = fileName.hashCode();
//哈希值最后四位大小
int fir = fileCode & 0xf;
//次后4位的值
int sec = fileCode>>>4 &0xf;
return "/"+fir+"/"+sec;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2