上传文件
a.引入两个jar
apache:commons-fileupload.jar组件
commons-fileupload.jar组件依赖commons-io.jar
b.代码
前台jsp:
<input type="file" name="spicture"/>
表单提交方式必须为post
在表单必须增加一个属性enctype="multipart/form-data"
后台servlet:
try { boolean isMultpart = ServletFileUpload.isMultipartContent(request); if(isMultpart) {//判断前台的form是否有multipart属性 FileItemFactory factory=new DiskFileItemFactory(); ServletFileUpload upload=new ServletFileUpload(factory); //通过parseRequest解析form中的所有请求字段,并保存到items集合中(即前台传递的sno,sname,spicture此时就保存在了items中) List<FileItem> items = upload.parseRequest(request); //遍历items中的数据(item=sno sname spicture) Iterator<FileItem> iter= items.iterator(); while(iter.hasNext()) { FileItem item = iter.next(); String itemName=item.getFieldName(); int sno=-1; String sname=null; //判断前台字段 是普通form表单字段(sno sname),还是文件字段 if(item.isFormField()) { if(itemName.equals("sno")) {//根据name属性判断item是sno sname还是spicture sno=Integer.parseInt(item.getString("utf-8")); //System.out.println("非其他字段sno"); }else if(itemName.equals("sname")) { sname=item.getString("utf-8"); //System.out.println("非其他字段sname"); }else { System.out.println("其他字段"); } }else {//spicture // 文件上传 //文件名 getFieldName是获取普通表单字段的Name值 //getName()是获取文件名 String fileName = item.getName(); //获取文件内容并上传 //定义文件路径:指定上传的位置(服务器路径) //获取服务器路径 String path=request.getSession().getServletContext().getRealPath("upload"); File file=new File(path,fileName); item.write(file);//上传 System.out.println(fileName+"上传成功!"); return ; } } } }catch (FileUploadException e) { e.printStackTrace(); }//解析请求 catch (Exception e) { e.printStackTrace(); }
注意的问题:
上传的目录 uplpad:
1.如果修改代码,则tomcat重启会被删除
原因:当修改代码的时候,tomcat会重新编译一份class并且重新部署(宠信创建各种目录)
2.如果不修改代码,则不会被删除
原因:没有修改代码,class仍然是之前的class
因此为了防止上传目录丢失:a.虚拟路径b.直接更改上传目录到非tomcat目录
限制上传:
类型:
String ext=fileName.substring(fileName.indexOf(".")+1); if(!(ext.equalsIgnoreCase("png")||ext.equalsIgnoreCase("gif")||ext.equalsIgnoreCase("jpg"))) { System.out.println("图片类型有误!格式只能是png gif png"); return; }
大小:
//设置上传文件时用到的临时文件的大小 DiskFileItemFactory factory.setSizeThreshold(10240);//设置临时文件的缓冲文件大小为10kb factory.setRepository(new File("D:\test\uploadtemp"));//设置临时文件的目录 //控制上传单个文件的大小 20kb ServletFileUpload upload.setSizeMax(20480);//字节
注意 对文件的限制条件 写在parseRequest之前