[Java]通過Nginx實現一個上傳頭像的功能

LoadServlet端代碼

package com.iweb.servlet;

import com.google.gson.Gson;

import javax.servlet.ServletException;
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;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.*;

@WebServlet("/upload/*")
//     在3.0之後
//     servlet會將上傳的請求封裝成 一個Part對象
//     文件的類型、文件的大小、文件名稱、文件內容(IO流)
//     接收文件上傳的上下文類型 multipart/form-data

@MultipartConfig
public class UploadServlet extends HttpServlet {

    /**
     * 3.0之後,servlet會將上傳的請求封裝成一個Part對象,我們只需要操作Part對象就可以了
     * 文件的類型、文件的大小、文件名稱、文件內容(IO流)
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("upload....");

        // 獲取文件封裝的Part對象
        Collection<Part> parts = req.getParts();
        // 單個文件上傳
        String fullFileName = "";
        if (parts.size() == 1) {
            //默認傳遞過來的是file
            Part part = req.getPart("file");
            String name = part.getName();
            String filename = part.getSubmittedFileName();
            String type = part.getContentType();
            InputStream stream = part.getInputStream();
            System.out.println("key: " + name);
            System.out.println("文件名稱: " + filename);
            System.out.println("文件類型: " + type);

            // 生成文件名稱:在外面的業務中,這裏可以查詢(session中)當前用戶的id,要加後綴名
            fullFileName = UUID.randomUUID().toString().replace("-", "") + "-" + filename;


            // 寫出文件
            part.write("D:\\env\\nginx-1.8.1\\static\\avatar\\" + fullFileName);
        }

        // 多個文件上傳,不用
        // 爲什麼不用:如果上傳了20個文件,對於當前請求,servlet的請求會開啓一個線程
        // 一般情況下,多個文件上傳,前端會通過異步請求

        if (parts.size() > 1) {
            Iterator<Part> its = parts.iterator();
            // 遍歷每個Part對象
        }
        PrintWriter writer = resp.getWriter();
        Map<String,String> map = new HashMap<>();
        map.put("message", "ok");

        // 生成圖片訪問路徑,並返回
        map.put("src", "http://localhost:80/avatar/" + fullFileName);
        writer.println(new Gson().toJson(map));
        writer.flush();
        writer.close();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章