乐趣区

关于jsp:JSP实现文件上传功能

这篇文章次要为大家具体介绍了 JSP 实现文件上传性能,文中示例代码介绍的十分具体,具备肯定的参考价值,感兴趣的小伙伴们能够参考一下

本文实例为大家分享了 JSP 实现文件上传性能的具体代码,供大家参考,具体内容如下

一、筹备局部
须要 fileupload.jar 与 io.jar 包共同完成。构建实现门路后可持续。

资源地址

二、页面局部

<form action="UploadServlet" method="post" enctype="multipart/form-data">
 学号:<input type="text" name="sno"/><br/>
 姓名:<input type="text" name="sname"/><br/>
 上传照片:<input type="file" name="spicture"/><br/>
 <input type="submit" value="注册"/>
</form>

留神:

1. 文件上传必须要应用 post,以防止用 get 办法时传输总量超过搜寻框所能承载最大字符数。

2. 必须退出 enctype=”multipart.form-data” 字段

3. 文件处需用“file”

三、Servlet 局部

package webtest;
  
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
  
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
  
/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
  
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 申请编码解决,传输时
  response.setCharacterEncoding("utf-8");// 响应编码解决, 传输时
  response.setContentType("utf-8");// 响应编码解决,显示时
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);// 判断是否有 entype="multipart/form-data" 局部
  if (isMultipart) {
   try {FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
     
    // 设置上传时的内存缓冲区大小,超出时写入临时文件  10kb
    ((DiskFileItemFactory) factory).setSizeThreshold(10240);// 单位 byte
    // 设置长期文件目录,避免零碎空间有余
    ((DiskFileItemFactory) factory).setRepository(new File(request.getSession().getServletContext().getRealPath("Uploadtemp")));// 动静获取 Uploadtemp 文件夹位于该我的项目中的地位
    // 管制上传单个文件的最大值 20kb
    upload.setSizeMax(20480);// 单位 byte
     
    List<FileItem> items = upload.parseRequest(request);// 解析 form 中的所有申请字段,并保留在 item 中
    Iterator<FileItem> iter = items.iterator();
  
    while (iter.hasNext()) {
     // 解析时无程序,因而需依据名字查找
     FileItem item = iter.next();
     if (item.isFormField()) {// 非文件数据
      String itemName = item.getFieldName();// 获取非文件的范畴数据名
      if (itemName.equals("sno")) {
       int sno = -1;
       sno = Integer.parseInt(item.getString("utf-8"));
      }
      else if (itemName.equals("sname")) {
       String sname = null; 
       sname = item.getString("utf-8");
  
      } 
      else {System.out.println("其余字段...");
      }
  
     } else {// 文件上传
      String fileName = item.getName();// 获取文件范畴数据。门路及其名称
      // 判断文件类型
      String ext = fileName.substring(fileName.indexOf(".")+1);
      if(!(ext.equals("png")||ext.equals("gif")||ext.equals("jpg"))) {System.out.println("仅反对 png.gif,jpg 类型文件");
       return ;
      }
      String path = request.getSession().getServletContext().getRealPath("Upload");// 动静获取 Upload 文件夹位于该我的项目中的地位
      File file = new File(path,fileName);
      item.write(file);// 定义上传门路,多为服务器门路
      System.out.println(fileName+"上传胜利");
     }
     item.delete();// 删除长期目录的文件}
   } 
   catch(FileUploadBase.SizeLimitExceededException e) {System.out.println("最大 20KB");
   }
   catch (FileUploadException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();} 
   catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();}
  }
 }
  
 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
  *      response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(request, response);
 }
  
}

注:

1. 若该处标红且鼠标悬停后未找到包,则能够应用 ”alt”+”/” 组合键抉择下图第一个类来导入。

2. 因为若 Upload 与 Uploadtemp 文件寄存于 tomcat 对应的我的项目下,每一次通过 eclipse 更新代码,会将 eclipse 下代码间接笼罩,因此两个文件夹会间接被笼罩掉。能够在 eclipse 中新建,或通过相对 / 相对路径于其余文件夹中来设置。

3. 临时文件中的数据会保留很短的工夫,增加 sleep 让程序休眠兴许能够看到。即便无 item.delete(),在整个会话实现后,临时文件也会被删除。

4. 若报错无奈找到文件,请尝试用浏览器若谷歌进行操作,而不是用 Eclipse 自带的。

以上就是本文的全部内容,心愿对大家的学习有所帮忙,也心愿大家多多反对 segmentfault。

退出移动版