文件上传功能的实现

时间:2022-08-31 15:03:09

前提:拷入两个包:文件上传功能的实现

一、Jsp页面设置:

制作表单:

<form action="${pageContext.request.contextPath}/AddProdServlet"method="post"enctype="multipart/form-data">

<table border="1">

<tr>

           <td>商品图片</td>

           <td><inputtype="file"name="file1"/></td>

       </tr>

<tr>

           <tdcolspan="2"><inputtype="submit"value="添加商品"/></td>

       </tr>

</table>

</form>

二.Servlet操作:

//创建map对象放置文件上传名和值

Map<String, String> map =new HashMap<String,String>();  

//创建DiskFileItemFactory对象,设置缓冲区大小和文件目录

DiskFileItemFactory factory =newDiskFileItemFactory()

factory.setSizeThreshold(1024*100);

factory.setRepository(new File(this.getServletContext()

.getRealPath("/WEB-INF/tmp")));

// 使用DiskFileItemFactory对象创建ServletFileUpload对象,并设置上传文件的大小限制。

ServletFileUpload fileUpload =new ServletFileUpload(factory);

//检查是否是正确的文件上传表单(使用isMultipartContent可以判断是普通表单还是带有文件的表单)

           if(!fileUpload.isMultipartContent(request))

           {

              thrownew RuntimeException("请用正确的表单进行上传");

           }

//设置单个文件上传的大小

fileUpload.setFileSizeMax(1024 * 10204 * 5);

//设置文件上传的总大小

fileUpload.setSizeMax(1024 * 10204 * 200);

//设置编码,解决上传文件名的乱码问题

fileUpload.setHeaderEncoding("utf-8");

//文件上传解析请求

List<FileItem> list =fileUpload.parseRequest(request);

//使用增强for循环遍历文件上传的内容

for (FileItemitem : list) {

//如果当前返回的内容是普通表单的类型

              if (item.isFormField()) {

//定义nameame用于返回表单标签name属性的值

                  Stringname =item.getFieldName();

//设置返回的value值是utf-8的格式

                  Stringvalue =item.getString("utf-8");

//将文件上传名和值放置到map中

                  map.put(name,value);

                  // System.out.println(name+" "+value);

              }else {

//如果不是普通表单的形式

                  Stringname =item.getName();

                  //创建随机名称,这样能够方便让上传文件名唯一

                  StringuuidName = UUID.randomUUID().toString()+name;

                  // System.out.println(uuidName);

                  //创建文件保存的路径

                  Stringpath =this.getServletContext().getRealPath(

                         "/WEB-INF/upload");

                //在系统中利用hashCode值,这样才能确保图片上传是唯一的

                  inthashCode =uuidName.hashCode();

                //将hashCode值转换成十六进制的字符串

                  StringhashStr = Integer.toHexString(hashCode);

                //将获得的字符串转换成数组

                  charhss[] =hashStr.toCharArray();  

                  Stringimgurl="/WEB-INF/upload";

//遍历,这样可以让文件包分配资源合理

                  for (charc : hss) {

                     path +="/" + c;

                     imgurl +="/" + c;

                  }

                  imgurl +="/" + uuidName;

                  map.put("imgurl",imgurl);

                  new File(path).mkdirs();

                  System.out.println(path);

                  //文件的读写

                  InputStreamin =item.getInputStream();

                  OutputStreamout =new FileOutputStream(new File(path,uuidName));

                  IOUtils.In2Out(in,out);

                  IOUtils.close(in,out);

                  //删除临时文件

                  item.delete();

                  PicUtilspicUtils =new PicUtils(path+"/"+uuidName);

                  picUtils.resizeByHeight(100);

              }

           }

           Prodprod =new Prod();

         //将前台传过来的数据封装到javaBean中;

           BeanUtils.populate(prod,map);

           service.addProd(prod);

           //3提示成功,返回首页

           response.getWriter().write("添加商品成功!3秒回首页");

           response.setHeader("Refresh","3;url="+request.getContextPath()+"/index.jsp");

       }catch (Exceptione) {

           e.printStackTrace();

       }