48factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB 49//设置上传时生成的临时文件的保存目录 50factory.setRepository(tmpFile); 51//2、创建一个文件上传解析器 52ServletFileUpload upload = new ServletFileUpload(factory); 53//文件上传进度 54upload.setProgressListener(new ProgressListener(){ 55public void update(long pBytesRead, long pContentLength, int arg2) { 56System.out.println("文件大小为:" pContentLength ",当前已处理:" pBytesRead); 57/** 58* 文件大小为:14608,当前已处理:4096 59文件大小为:14608,当前已处理:7367 60文件大小为:14608,当前已处理:11419 61文件大小为:14608,当前已处理:14608 62*/ 63} 64}); 65//解决上传文件名的中文乱码 66upload.setHeaderEncoding("UTF-8"); 67//3、判断提交上来的数据是否是上传表单的数据 68if(!ServletFileUpload.isMultipartContent(request)){ 69//按照传统方式获取数据 70return; 71} 7273//设置上个文件的大小的最大,目前是设置为1024*1024字节,也就是1MB 74upload.setFileSizeMax(1024*1024); 75//设置上传文件总量的最大,最大=同时上传的多个文件的大小的最大的和,目前设置为10MB 76upload.setSizeMax(1024*1024*10); 77//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 78List<FileItem> list = upload.parseRequest(request); 79for(FileItem item : list){ 80//如果fileitem中封装的是普通输入项的数据 81if(item.isFormField()){ 82String name = item.getFieldName(); 83//解决普通输入项的数据的中文乱码问题 84String value = item.getString("UTF-8"); 85//value = new String(value.getBytes("iso8859-1"),"UTF-8"); 86System.out.println(name "=" value); 87}else{//如果fileitem中封装的是上传文件 88//得到上传的文件名称, 89String filename = item.getName(); 90System.out.println(filename); 91if(filename==null || filename.trim().equals("")){ 92continue; 93} 94//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt 95//处理获取到的上传文件的文件名的路径部分,只保留文件名部分 96filename = filename.substring(filename.lastIndexOf("\\")1); 97//得到上传文件的扩展名 98String fileExtName = filename.substring(filename.lastIndexOf(".")1); 99//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法100System.out.println("上传的文件的扩展名是:"fileExtName);101//获取item中的上传文件的输入流102InputStream in = item.getInputStream();103//得到文件保存的名称104String saveFilename = makeFileName(filename);105//得到文件的保存目录106String realSavePath = makePath(saveFilename, savePath);107//创建一个文件输出流108FileOutputStream out = new FileOutputStream(realSavePath "\\" saveFilename);109//创建一个缓冲区110byte buffer[] = new byte[1024];111//判断输入流中的数据是否已经读完的标识112int len = 0;113//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据114while((len=in.read(buffer))>0){115//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath "\\" filename)当中116out.write(buffer, 0, len);117}118//关闭输入流119in.close();120//关闭输出流121out.close();122//删除处理文件上传时生成的临时文件123//item.delete();124message = "文件上传成功!";125}126}127}catch (FileUploadBase.FileSizeLimitExceededException e) {128e.printStackTrace();129request.setAttribute("message", "单个文件超出最大!!!");130request.getRequestDispatcher("/message.jsp").forward(request, response);131return;132}catch (FileUploadBase.SizeLimitExceededException e) {133e.printStackTrace();134request.setAttribute("message", "上传文件的总的大小超出限制的最大!!!");135request.getRequestDispatcher("/message.jsp").forward(request, response);136return;137}catch (Exception e) {138message= "文件上传失败!";139e.printStackTrace();140}141request.setAttribute("message",message);142request.getRequestDispatcher("/message.jsp").forward(request, response);143}144145/**146* @Method: makeFileName147* @Description: 生成上传文件的文件名,文件名以:uuid"_"文件的原始名称148* @Anthor:孤傲苍狼149* @param filename 文件的原始名称150* @return uuid"_"文件的原始名称151*/ 152private String makeFileName(String filename){ //2.jpg153//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名154return UUID.randomUUID().toString() "_" filename;155}156157/**158* 为防止一个目录下面出现太多文件,要使用hash算法打散存储159* @Method: makePath160* @Description: 161* @Anthor:孤傲苍狼162*163* @param filename 文件名,要根据文件名生成存储目录164* @param savePath 文件存储路径165* @return 新的存储目录166*/ 167private String makePath(String filename,String savePath){168//得到文件名的hashCode的,得到的就是filename这个字符串对象在内存中的地址169int hashcode = filename.hashCode();170int dir1 = hashcode&0xf; //0--15171int dir2 = (hashcode&0xf0)>>4; //0-15172//构造新的保存目录173String dir = savePath "\\" dir1 "\\" dir2; //upload\2\3 upload\3\5174//File既可以代表文件也可以代表目录175File file = new File(dir);176//如果目录不存在177if(!file.exists()){178//创建目录179file.mkdirs();180}181return dir;182}183 184public void doPost(HttpServletRequest request, HttpServletResponse response)185throws ServletException, IOException {186 187doGet(request, response);188}189 }
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-52904-5.html
避开政治不谈
爱你