【笔记】上传图片和音频
16lz
2021-01-22
1 package image; 2 3 4 import java.io.File; 5 import java.io.IOException; 6 import java.io.PrintWriter; 7 import java.util.List; 8 import java.util.UUID; 9 10 import javax.servlet.ServletConfig; 11 import javax.servlet.ServletContext; 12 import javax.servlet.ServletException; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 17 import org.apache.commons.fileupload.FileItem; 18 import org.apache.commons.fileupload.FileUploadException; 19 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 20 import org.apache.commons.fileupload.servlet.ServletFileUpload; 21 22 23 /** 24 * 文件上传 25 * @author Administrator 26 * 27 */ 28 public class ImageAction extends HttpServlet { 29 30 private static final long serialVersionUID = 1L; 31 32 // 保存文件的目录 33 private static String PATH_FOLDER1 = "/"; 34 private static String PATH_FOLDER2 = "/"; 35 // 存放临时文件的目录 36 private static String TEMP_FOLDER = "/"; 37 38 39 @Override 40 public void init(ServletConfig config) throws ServletException { 41 ServletContext servletCtx = config.getServletContext(); 42 // 初始化路径 43 // 保存文件的目录 44 PATH_FOLDER1 = servletCtx.getRealPath("/audioUpload"); 45 PATH_FOLDER2 = servletCtx.getRealPath("/imageUpload"); 46 // 存放临时文件的目录,存放xxx.tmp文件的目录 47 TEMP_FOLDER = servletCtx.getRealPath("/uploadTemp"); 48 } 49 50 /** 51 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 52 * response) 53 */ 54 protected void doGet(HttpServletRequest request, 55 HttpServletResponse response) throws ServletException, IOException { 56 request.setCharacterEncoding("utf-8"); // 设置编码 57 response.setCharacterEncoding("utf-8"); 58 response.setContentType("text/html;charset=UTF-8"); 59 String method = request.getParameter("method"); 60 if (method == null) { 61 method = "image"; 62 } 63 64 if ("image".equals(method)) { 65 image(request, response); 66 } else if ("audio".equals(method)) { 67 audio(request, response); 68 } 69 } 70 private void image(HttpServletRequest request, 71 HttpServletResponse response) { 72 // 获得磁盘文件条目工厂 73 DiskFileItemFactory factory = new DiskFileItemFactory(); 74 75 // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 76 // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 77 /** 78 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 79 * 格式的 然后再将其真正写到 对应目录的硬盘上 80 */ 81 factory.setRepository(new File(TEMP_FOLDER)); 82 // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 83 factory.setSizeThreshold(1024 * 1024); 84 85 // 高水平的API文件上传处理 86 ServletFileUpload upload = new ServletFileUpload(factory); 87 88 try { 89 // 提交上来的信息都在这个list里面 90 // 这意味着可以上传多个文件 91 // 请自行组织代码 92 List<FileItem> list = upload.parseRequest(request); 93 // 获取上传的文件 94 FileItem item = getUploadFileItem(list); 95 // 获取文件名 96 String filename = getUploadFileName1(item); 97 98 // System.out.println("存放目录:" + PATH_FOLDER); 99 // System.out.println("文件名:" + filename); 100 // 真正写到磁盘上 101 item.write(new File(PATH_FOLDER2, filename)); // 第三方提供的 102 103 PrintWriter writer = response.getWriter(); 104 105 writer.print("{"); 106 // writer.print("msg:\"文件大小:"+item.getSize()+",文件名:"+filename+"\""); 107 writer.print("msg:\""+filename+"\""); 108 writer.print("}"); 109 110 writer.close(); 111 112 } catch (FileUploadException e) { 113 e.printStackTrace(); 114 } catch (Exception e) { 115 e.printStackTrace(); 116 } 117 118 119 } 120 private void audio(HttpServletRequest request, 121 HttpServletResponse response) { 122 // 获得磁盘文件条目工厂 123 DiskFileItemFactory factory = new DiskFileItemFactory(); 124 125 // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存, 126 // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 127 /** 128 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 129 * 格式的 然后再将其真正写到 对应目录的硬盘上 130 */ 131 factory.setRepository(new File(TEMP_FOLDER)); 132 // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 133 factory.setSizeThreshold(1024 * 1024); 134 135 // 高水平的API文件上传处理 136 ServletFileUpload upload = new ServletFileUpload(factory); 137 138 try { 139 // 提交上来的信息都在这个list里面 140 // 这意味着可以上传多个文件 141 // 请自行组织代码 142 List<FileItem> list = upload.parseRequest(request); 143 // 获取上传的文件 144 FileItem item = getUploadFileItem(list); 145 // 获取文件名 146 String filename = getUploadFileName2(item); 147 filename=filename+".wav"; 148 // System.out.println("存放目录:" + PATH_FOLDER); 149 // System.out.println("文件名:" + filename); 150 // 真正写到磁盘上 151 item.write(new File(PATH_FOLDER1, filename)); // 第三方提供的 152 153 PrintWriter writer = response.getWriter(); 154 155 // writer.print("{"); 156 // writer.print("msg:\"文件大小:"+item.getSize()+",文件名:"+filename+"\""); 157 writer.print(filename); 158 // writer.print("}"); 159 160 writer.close(); 161 162 } catch (FileUploadException e) { 163 e.printStackTrace(); 164 } catch (Exception e) { 165 e.printStackTrace(); 166 } 167 168 169 } 170 private FileItem getUploadFileItem(List<FileItem> list) { 171 for (FileItem fileItem : list) { 172 if(!fileItem.isFormField()) { 173 return fileItem; 174 } 175 } 176 return null; 177 } 178 private String getUploadFileName1(FileItem item) { 179 // 获取路径名 180 String value = item.getName(); 181 // 索引到最后一个反斜杠 182 int start = value.lastIndexOf("/"); 183 // 截取 上传文件的 字符串名字,加1是 去掉反斜杠, 184 String name =UUID.randomUUID().toString().trim().replaceAll("-", ""); 185 int sub = value.lastIndexOf("."); 186 String filename = value.substring(value.length()-sub,value.length()); 187 188 return name+filename; 189 } 190 private String getUploadFileName2(FileItem item) { 191 // 获取路径名 192 String value = item.getName(); 193 // 索引到最后一个反斜杠 194 int start = value.lastIndexOf("/"); 195 // 截取 上传文件的 字符串名字,加1是 去掉反斜杠, 196 String name =UUID.randomUUID().toString().trim().replaceAll("-", ""); 197 String filename = value.substring(value.length()-4,value.length()); 198 199 return name+filename; 200 } 201 202 203 /** 204 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 205 * response) 206 */ 207 protected void doPost(HttpServletRequest request, 208 HttpServletResponse response) throws ServletException, IOException { 209 this.doGet(request, response); 210 } 211 212 213 }