一 javaweb总结--文件上传和下载( 二 )

集合 , 每一个FileItem对应一个Form表单的输入项List list = upload.parseRequest(request);for(FileItem item : list){//如果fileitem中封装的是普通输入项的数据if(item.isFormField()){String name = item.getFieldName();//解决普通输入项的数据的中文乱码问题String value = http://www.kingceram.com/post/item.getString("UTF-8");//value = http://www.kingceram.com/post/new String(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name + "=" + value);}else{//如果fileitem中封装的是上传文件//得到上传的文件名称 , String filename = item.getName();System.out.println(filename);if(filename==null || filename.trim().equals("")){continue;}//注意:不同的浏览器提交的文件名是不一样的 , 有些浏览器提交上来的文件名是带有路径的 , 如:c:\a\b\1.txt , 而有些只是单纯的文件名 , 如:1.txt//处理获取到的上传文件的文件名的路径部分 , 只保留文件名部分filename = filename.substring(filename.lastIndexOf("\\")+1);//得到上传文件的扩展名String fileExtName = filename.substring(filename.lastIndexOf(".")+1);//如果需要限制上传的文件类型 , 那么可以通过文件的扩展名来判断上传的文件类型是否合法System.out.println("上传的文件的扩展名是:"+fileExtName);//获取item中的上传文件的输入流InputStream in = item.getInputStream();//得到文件保存的名称String saveFilename = makeFileName(filename);//得到文件的保存目录String realSavePath = makePath(saveFilename, savePath);//创建一个文件输出流FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);//创建一个缓冲区byte buffer[] = new byte[1024];//判断输入流中的数据是否已经读完的标识int len = 0;//循环将输入流读入到缓冲区当中 , (len=in.read(buffer))>0就表示in里面还有数据while((len=in.read(buffer))>0){//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中out.write(buffer, 0, len);}//关闭输入流in.close();//关闭输出流out.close();//删除处理文件上传时生成的临时文件//item.delete();message = "文件上传成功!";}}}catch (FileUploadBase.FileSizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "单个文件超出最大值!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}catch (FileUploadBase.SizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}catch (Exception e) {message= "文件上传失败!";e.printStackTrace();}request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request, response);}/*** @Method: makeFileName* @Description: 生成上传文件的文件名 , 文件名以:uuid+"_"+文件的原始名称* @Anthor:孤傲苍狼* @param filename 文件的原始名称* @return uuid+"_"+文件的原始名称*/ private String makeFileName(String filename){//2.jpg//为防止文件覆盖的现象发生 , 要为上传文件产生一个唯一的文件名return UUID.randomUUID().toString() + "_" + filename;}/*** 为防止一个目录下面出现太多文件 , 要使用hash算法打散存储* @Method: makePath* @Description: * @Anthor:孤傲苍狼** @param filename 文件名 , 要根据文件名生成存储目录* @param savePath 文件存储路径* @return 新的存储目录*/ private String makePath(String filename,String savePath){//得到文件名的hashCode的值 , 得到的就是filename这个字符串对象在内存中的地址int hashcode = filename.hashCode();int dir1 = hashcode&0xf;//0--15int dir2 = (hashcode&0xf0)>>4;//0-15//构造新的保存目录String dir = savePath + "\\" + dir1 + "\\" + dir2;//upload\2\3upload\3\5//File既可以代表文件也可以代表目录File file = new File(dir);//如果目录不存在if(!file.exists()){//创建目录file.mkdirs();}return dir;}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}