码上的那些事我爱编程

如何使用formData对象进行(同步或异步)文件的上传

2018-04-10  本文已影响109人  爱音乐的二狗子

通常,servlet应用中我们都是使用apche的common-fileupload.jar、common-io.jar进行文件的上传和下载。但我们在不使用第三方jar的情况下该如何实现文件的上传呢?h5标准出来后,我们可以借助formData对象结合Servlet3的特性实现文件的上传和下载。

jsp页面表单部分(直接form提交时的写法,大家懂的,记得引入JQuery库)

<form  action="<%=request.getContextPath() %>/fileIOServlet" method="post"  enctype="multipart/form-data">
项目sql文件:<input name="sqlfile"  id="sqlfile" type="file" /><br>
项目war包:<input name="warfile" id="warfile" type="file" /><br>
              <input name="handle" id="handle" type="hidden" value="upload"/>
              <input type="submit" value="上传"/>
</form>

jsp页面表单部分(通过ajax提交时的写法)


<div id="upload">
         项目sql文件:<input name="sqlfile"  id="sqlfile" type="file" /><br>
             项目war包:<input name="warfile" id="warfile" type="file" /><br>
            <input name="handle" id="handle" type="hidden" value="upload"/>
               <button id="submit" onclick="uploadFile()">上传</button>
         </div>

Ajax 请求的js代码(这里只写关键代码,数据校验的请自行处理):

<script type="text/javascript">
      var cp='<%=request.getContextPath() %>';
      function uploadFile() {
      if($("#sqlfile").val()==""||$("#sqlfile").val().lastIndexOf(".sql")==-1){
                 alert("请选择sql文件");
                 return false;
             }
             if($("#warfile").val()==""||$("#warfile").val().lastIndexOf(".war")==-1){
                 alert("请选择war文件");
                 return false;
             }
              var formData = new FormData();
                 formData.append("sqlfile",$("#sqlfile")[0].files[0]);
                 formData.append("warfile",$("#warfile")[0].files[0]);
                 formData.append("handle",$("#handle").val());
             $.ajax({
                  url: '<%=request.getContextPath() %>/fileIOServlet',
                  type: 'post',
                  data: formData,
                  async: false,
                  cache: false,
                  contentType: false,
                  processData: false,
                  success: function (returndata) {
                      $("#sqlfile").val("");
                      $("#warfile").val("");
                      $("#icofile").val("");
                      alert("文件上传成功!");
                  },
                  error: function (returndata) {
                      alert("文件上传出错!");
                  }
             });
}
<script>

下面是Servlet处理上传文件的共用代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/fileIOServlet")
@MultipartConfig
public class FileIOServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   private String            sperator         = File.pathSeparator;
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.doPost(request, response);
   }
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String handle = request.getParameter("handle");
      if ("upload".equals(handle)) {    //这里仅是逻辑的处理,大家可根据实际情况进行修改
         upload(request, response);
      }
 /**
    * @param request
    * @param response
    */
   private void upload(HttpServletRequest request, HttpServletResponse response) {
      //这里我将sql文件和war包放到项目之外的不同目录,保存路径大家自己设置,谢谢
      String sqlPath = "F:\\PackageUtil\\packaged\\";
      String warPath = "F:\\PackageUtil\\packaged\\tomcat-7.0.63\\webapps\\";
      try {
         request.setCharacterEncoding("utf-8");
         response.setCharacterEncoding("utf-8");
         response.setContentType("text/html;charset=utf-8");
         String fileName = "";
         String header = "";
         Collection<Part> parts = request.getParts();
         if (null == parts) {
            //
         }
         File f = null;
         String sqlfix = "^.*[.sql]$";//以".sql"结尾的文件 
         String warfix = "^.*[.war]$";//以".war"结尾的文件 
      
         for (Part part : parts) {
            if ("sqlfile".equals(part.getName())) {
               header = part.getHeader("Content-Disposition");
               fileName = getFileName(header);
               f = new File(sqlPath);
               //删除同目录下同一类型的文件,如果没有这个需求可将如下标注的代码段删掉
               //begin----------------------删掉-----------------------------
               File fileList[] = f.listFiles();
               for (File file : fileList) {
                  if (file.isFile()) {   
                     if (file.getName().matches(sqlfix)) file.delete();
                  }
               }
             //end----------------------删掉-----------------------------
               part.write(sqlPath + fileName);
            }
            else if ("warfile".equals(part.getName())) {
               header = part.getHeader("Content-Disposition");
               fileName = getFileName(header);
               f = new File(warPath);
               //删除同目录下同一类型的文件,如果没有这个需求可将如下标注的代码段删掉
               //begin----------------------删掉-----------------------------
               File fileList[] = f.listFiles();
               for (File file : fileList) {
                  if (file.isFile()) {
                     if (file.getName().matches(warfix)) file.delete();
                  }
               }
              //begin----------------------删掉-----------------------------
               part.write(warPath + fileName);
            }
            
         }
      }
      catch (Exception e) {
         e.printStackTrace();
      }
   }
 /**
    * 文件下载
    */
   private void download(HttpServletRequest request, HttpServletResponse response) {
      File fIn = new File("F:\\PackageUtil\\Output\\setup.exe");
      FileInputStream inputStream = null;
      ServletOutputStream out = null;
      response.setContentType("application/octet-stream");
      try {
         response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileNameString, "UTF-8"));
         inputStream = new FileInputStream(fIn);
         out = response.getOutputStream();
         int temp = 0;
         byte[] bArray = new byte[1024];
         while ((temp = inputStream.read(bArray)) != -1) {
            out.write(bArray, 0, temp);
         }
         inputStream.close();
         out.close();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
   }
/**
    * @param header
    * @return
    */
   private String getFileName(String header) {
      return header.split("=")[2].replaceAll("\"", "");
   }
      }

更多内容请查看官网:https://docs.oracle.com/javaee/7/tutorial/servlets016.htm#BABDGFJJ
谢谢关注与支持!

上一篇 下一篇

猜你喜欢

热点阅读