- 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;
- }
- }
复制代码
|
|