1. 程式人生 > >servlet 上傳檔案,下載檔案響應頭部設定

servlet 上傳檔案,下載檔案響應頭部設定

使用apache的開源jar編寫
jar包資訊

編寫檔案上傳幫助類

/**
 * 檔案上傳幫助類
 * 
 * @author ajie
 *
 */
public class FileUploadUtil {

    /**
     * 建立資料夾
     */
    public static void exitsFile(String filePath) {

        // 判斷如果資料夾不存在
        if (!new File(filePath).isDirectory()) {

            // 建立資料夾
            new File(filePath).mkdirs();

        }

    }

    /**
     * 上傳檔案方法
     * 
     * @param
request * 用於獲取專案名 * @param type * 用於區分檔案型別 * @param userName * 使用者名稱,區分檔案 * @return * @throws Exception */
public static List<String> upload(HttpServletRequest request, String type, String userName) throws Exception { // 用於獲取檔案路徑
List<String> list = new ArrayList<String>(); // 獲取專案上下文路徑 String contextPath = request.getContextPath().replaceAll("/", ""); // 拼接儲存檔案路徑 String path = ",webapps,files," + contextPath + "," + type + "," + userName; // 獲取檔案路徑 String filePath = System.getProperty("catalina.base"
) + path.replace(',', File.separatorChar); // 建立資料夾 FileUploadUtil.exitsFile(filePath); System.out.println("檢視專案物理路徑----》》》" + filePath); // 建立磁碟檔案專案工廠物件 DiskFileItemFactory fileFactory = new DiskFileItemFactory(); // 建立servlet檔案上傳物件 ServletFileUpload fileUpload = new ServletFileUpload(fileFactory); // 設定檔案大小 fileUpload.setSizeMax(1024 * 1024 * 1024 * 5); try { // 獲取request所有引數 List item = fileUpload.parseRequest(request); System.out.println("獲取的request引數值----》》》》" + item); // 將list轉為迭代 Iterator iterator = item.iterator(); while (iterator.hasNext()) { // 獲取單個檔案專案物件 FileItem fileItem = (FileItem) iterator.next(); // 判斷欄位不為普通欄位 if (!fileItem.isFormField()) { System.out.println("檔案屬性名---》》》" + fileItem.getFieldName() + ",檔名----》》》》" + fileItem.getName() + ",檔案型別---》》》" + fileItem.getContentType() + ",是否為普通欄位---》》》" + fileItem.isFormField()); // 拼接檔案儲存位置 String strPath = "files/" + contextPath + "/" + type + "/" + userName + "/" + fileItem.getName(); list.add(strPath); // 建立檔案物件 File file = new File(filePath + "/" + fileItem.getName()); // 在指定路徑寫入該檔案 fileItem.write(file); } else { throw new Exception("你個小子就是在瞎搞,會給你搞炸的。。。。。。"); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } }

編寫上傳servlet

package com.javaketang.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.servlet.ServletRequestContext;

import com.javaketang.util.FileUploadUtil;

import net.sf.json.JSONObject;

/**
 * 用於上傳檔案使用
 * 
 * @author ajie
 *
 */
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 封裝了很多request的操作,可以去看api
        RequestContext requestContext = new ServletRequestContext(req);


        // 設定請求響應編碼集
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        // 顯示在前臺資料
        JSONObject json = new JSONObject();

        // 提示資訊
        String message = "";

        // 判斷該表單為multipart型別
        if (FileUpload.isMultipartContent(requestContext)) {

            try {
                // 獲取返回的檔案地址
                List<String> strPath = FileUploadUtil.upload(req, "img", "admin");

                message = "上傳成功,恭喜老表";

                json.put("filePath", strPath);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                message = e.getMessage();
            }

        } else {

            message = "上傳失敗,不是multipart請求資料型別";

        }

        json.put("message", message);

        resp.getWriter().write(json.toString());
    }

}

這裡使用form的multipart/form-data型別上傳圖片

配置web.xml


    <!-- 檔案上傳servlet地址配置 -->
    <servlet>
        <servlet-name>file</servlet-name>
        <servlet-class>com.javaketang.servlet.FileUploadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>file</servlet-name>
        <url-pattern>/file</url-pattern>
    </servlet-mapping>

這裡沒有使用filter過濾器過濾編碼集,可以自己根據要求新增字元編碼過濾器

編寫檔案上傳fileUpload.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>
<script type="text/javascript" src="../statics/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">

    var util = {

            file_upload:function file_upload(){

                var obj = new FormData();

                var file1 = document.getElementById("file1").files[0];
                var file2 = document.getElementById("file2").files[0];

                obj.append("file1",file1);
                obj.append("file2",file2);


                console.log("請求引數---》》》"+obj);

                $.ajax({
                    url:'../file',
                    type:'POST',
                    data:obj,
                    contentType:false,
                    processData:false, 
                    mimeType:'multipart/form-data',
                    success:function(data){

                        console.log(data);
                    }
                })
            }

    }

</script>
</head>
<body>

    <form action="../file" enctype="multipart/form-data" method="POST" >
        <h2>基本form表單上傳檔案</h2>
        檔案一:<input type="file" name="file1"/><br/>
        檔案二:<input type="file" name="file2"/><br/>
        <input type="submit" value="提交"/>
    </form>

    <div>
        <h3>ajax上傳檔案</h3>
        檔案一:<input type="file" id="file1" /><br/>
        檔案二:<input type="file" id="file2"/><br/>
        <input type="button" onclick="util.file_upload()" value="上傳提交">
    </div>


</body>
</html>

使用兩種方式上傳檔案,form表單提交和ajax請求方式

jsp頁面執行效果:
上傳檔案jsp執行效果

上傳完成後執行效果:
form表單上傳效果如下:
form表單提交上傳檔案

ajax非同步上傳檔案效果:
ajax非同步上傳檔案

下載檔案response響應頭部設定

下載檔案可以根據檔案型別進行設定reponse響應頭部,下載對應對應的檔案,這裡就不做介紹了,可以在
Tomcat的conf檔案中,找到web.xml,裡面有對應檔案型別的響應頭部設定:

web.xml響應頭部設定

下面是Excel響應頭部設定servlet程式碼:

package com.javaketang.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ExcelServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 設定Excel響應頭部,在請求該servlet時自動下載Excel檔案
        resp.setContentType("application/vnd.ms-excel;charset=UTF-8");

        // 設定響應頭部,啟用檔案下載對話方塊
        resp.setHeader("Content-disposition", "attachment;filename=excel.xls");

        // 建立PrintWriter 例項
        PrintWriter excel = resp.getWriter();

        // 這裡輸出的字串會在excel中
        excel.write("this is excel");

        excel.close();

    }

}

web.xml配置下載servlet請求地址:

    <!-- 下載servlet配置 -->
    <servlet>
        <servlet-name>download</servlet-name>
        <servlet-class>com.javaketang.servlet.ExcelServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>download</servlet-name>
        <url-pattern>/download</url-pattern>
    </servlet-mapping>

請求這個servlet,地址會被封裝為檔名稱,可以將其封裝為通用的下載servlet,需要編寫下載幫助類,
用於區分檔案型別,設定response響應頭部,下載後的excel如下圖:
下載excel效果圖

可以根據自己實際需要設計下載和上傳檔案的編寫,如果有更好的方式可以相互討論學習,希望這個例項可以幫到大家