美文网首页码上的那些事我爱编程
如何使用formData对象进行(同步或异步)文件的上传

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

作者: 爱音乐的二狗子 | 来源:发表于2018-04-10 20:06 被阅读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
    谢谢关注与支持!

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/zsanhftx.html