新萄京计算机网络

 新萄京计算机网络     |      2020-04-01

servlet代码:(apache组件实现)

1:我们学的是表单文件上传,就是在一个FORM中提交相应的信息,和之前我们的提交的注册信息之类的表单是不同的,所以要先改变一下FORM的属性,enctype="multipart/form-data“,这个属性告诉服务器,我们是要提交文件了,而不是一个表单。
在服务器端也需要判断下
boolean isUpload = ServletFileUpload.isMultipartContent(request);
判断请求中是否有这种标示。

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
    
  request.setCharacterEncoding("utf-8");
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  if (!isMultipart) {
   return;
  }
  try {
   DiskFileItemFactory factory = new DiskFileItemFactory();
   factory.setSizeThreshold(4096);
   factory.setRepository(new File(tempPath));
   // Create a new file upload handler
   ServletFileUpload upload = new ServletFileUpload(factory);
   // Set overall request size constraint
   upload.setSizeMax(1263509131 * 1024);
   List items = upload.parseRequest(request);
   Iterator iter = items.iterator();
   while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    // 忽略其他不是文件域的所有表单信息
    if (!item.isFormField()) {
     name = item.getName();
     name = name.substring(name.lastIndexOf(File.separator) + 1,name.length());
     long size = item.getSize();
     if ((name == null || name.equals("")) && size == 0)
      continue;

2:<input type=“file” />这是表单中用来选择上传文件用的,在表单中有这个元素后,会会自动生成一个输入框和一个按钮,作用和awt中的FileDialog类的作用蛮像的。

     item.write(new File("G:/java工具/Tomcat免安装/tomcat/webapps/teleProject",uploadPath + name));// 这里的路径你可以改成你感兴趣的地方
     System.out.println(uploadPath + name);
     filename = name;
     
    }
   }
   //可以跳转成功页面

3:我们主要使用Commons-fileupload.jar中的类,commons-io是提供流服务用的,我们没有对它进行操作。
主要使用的如下:

  } catch (Exception e) {
   // 可以跳转出错页面
   e.printStackTrace();
   
  }

FileItem-------DiskFileItemFactory-----ServletFileUpload 

}

作用:
FileItem 用来封装表单中的元素和数据。

 

ServletFileUpload 处理表单数据,将数据封装到 FileItem 对象中。

今天写这个代码很郁闷,一直在List items = upload.parseRequest(request);这里出错;,后来通过大量的查找资料才知道不光要commons-fileupload包,还要commons-io包。

DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录。

 

ServletFileUpload 处理上传的文件的数据,优先保存在缓冲区,如果数据超过了缓冲区大小,则保存到硬盘上,存储在DiskFileItemFactory指定目录下的临时文件。数据都接收完后,它再在从临时文件中将数据写入到上传文件目录下的指定文件中,并删除临时文件。

4:几个小功能

限制上传文件的大小 
long MAXSIZE=1024*1024*3; 单位是byte,所以这里指定的是3M
upload.setFileSizeMax(MAXSIZE);

设定临时目录
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024); 设定了1M的缓冲区
factory.setRepository(new File("E:/temp")); 设置上传文件的临时目录
如果上传的文件小于1M,那么文件就在缓冲区中,然后写入硬盘,不经过缓冲区。这样也就不用硬盘的读写了,应该比较快。

定义服务器能接受的文件类型。
String[] allowTypes = new String[]{"jpg","jpeg"};
用数组定义可接受文件的后缀名,在读取表单内容后,取得客户端上传文件的全名,再截取后缀名,取到最后一个.的下标,再拿到之后所有的字符串:
String endName= fileName.substring(fileName.lastIndexOf(".")+1);
用数组遍历,如果不在数组中有定义,那么就不接受。
throw new RuntimeException("文件类型["+endName+"],不支持");

最基本的代码实现:
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try { 
List<FileItem> items = upload.parseRequest(request); //解析request请求
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) { //如果是表单域 ,就是非文件上传元素 
String name = item.getFieldName(); //获取name属性的值
String value = item.getString(); //获取value属性的值
} else { 
String fieldName = item.getFieldName(); //文件域中name属性的值
String fileName = item.getName(); //文件的全路径,绝对路径名加文件名 
String contentType = item.getContentType(); //文件的类型
long size = item.getSize(); //文件的大小,以字节为单位 
File saveFile = new File("D:/test.jpg"); //定义一个file指向一个具体的文件
item.write(saveFile); //把上传的内容写到一个文件中

}