Spring Mvc 批量動態上傳圖片

批量就是可以上傳多張圖片,動態就是不用指定上傳控件的NAME。

一、上傳代碼controller

    @ResponseBody
    @RequestMapping(value = "/images", method = {RequestMethod.POST})
    public List<String> getById(HttpServletRequest request) {
        //最終返回的數據
        List<String> imgSrc = new ArrayList<>();
        //只處理上傳的表單類型
        String contentType = request.getContentType();
        if (contentType != null && contentType.toLowerCase().startsWith("multipart/")) {
            MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
            for (Iterator<String> iter = multipartRequest.getFileNames(); iter.hasNext(); ) {
                String fileName = iter.next();
                //這裏使用數組接收,爲了防止前臺上傳圖片控件的Name是相同的
                List<MultipartFile> multipartFiles = multipartRequest.getFiles(fileName);
                for (MultipartFile multipartFile : multipartFiles) {
                    if (multipartFile.getContentType().startsWith("image/") && multipartFile.getSize() > 0) {
                        //調用上傳圖片工具類
                        String src = UploadUtil.getInstance().uploadFile2ImageServer(multipartFile, new HashMap<String, String>());
                        imgSrc.add(src);
                    }
                }
            }
        }
        imgSrc.add(request.getParameter("bbc"));
        return imgSrc;
    }

二、調用的UploadUtil

package com.ylbs.core.upload;

import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.ylbs.core.ConstantsEJS;
import com.ylbs.core.freemarkerutil.DomainUrlUtil;

/**
 * 上傳圖片工具類,上傳到服務器
 * 
 * @Filename: UploadUtil.java
 * @Version: 1.0
 * @Author: 王朋
 * @Email: [email protected]
 *
 */
public class UploadUtil {
    private static UploadUtil   uploadUtil;
    private static final String BOUNDARY     = UUID.randomUUID().toString(); // 邊界標識 隨機生成
    private static final String PREFIX       = "--";
    private static final String LINE_END     = "\r\n";
    private static final String CONTENT_TYPE = "multipart/form-data";        // 內容類型

    /**
     * 獲得上傳成功後的路徑
     */
    private static String       result       = null;

    private UploadUtil() {

    }

    /**
     * 單例模式獲取上傳工具類
     * @return
     */
    public static UploadUtil getInstance() {
        result = null;
        if (null == uploadUtil) {
            uploadUtil = new UploadUtil();
        }
        return uploadUtil;
    }

    private int                 readTimeOut                = 30 * 1000;                       // 讀取超時 30s
    private int                 connectTimeout             = 60 * 1000;                       // 超時時間 1分鐘

    /***
     * 請求使用多長時間
     */
    private static int          requestTime                = 0;

    private static final String CHARSET                    = "utf-8";                         // 設置編碼

    /**
     * UEDITOR 上傳圖片
     */
    private static final String UTLPATH_IMAGE_UEDITOR      = DomainUrlUtil.EJS_IMAGE_RESOURCES
                                                             + "/imageUtilUmeditor";

    /**
     * 品牌 上傳圖片
     */
    private static final String BRAND_IMAGE_PATH           = DomainUrlUtil.EJS_IMAGE_RESOURCES
                                                             + "/imageUtilBrand";

    /**
     * 廣告上傳圖片
     */
    public static final String  ADV_IMAGE_PATH             = DomainUrlUtil.EJS_IMAGE_RESOURCES
                                                             + "/imageUtilAdv";

    /**
     * 移動端首頁上傳圖片
     */
    public static final String  M_INDEX_IMAGE_PATH         = DomainUrlUtil.EJS_IMAGE_RESOURCES
                                                             + "/imageMobileUtilAdv";

    /**
     * 快遞模板上傳圖片
     */
    public static final String  COURIER_COMPANY_IMAGE_PATH = DomainUrlUtil.EJS_IMAGE_RESOURCES
                                                             + "/imageCourierCompany";

    /**
     * 通用圖片上傳
     */
    public static final String  COMMON_IMAGE_UPLOAD_PATH   = DomainUrlUtil.EJS_IMAGE_RESOURCES
                                                             + "/commonImageUploadServlet";

    /**
     * 上傳至圖片服務器,不指定圖片寬高,不剪裁圖片
     * @param file
     * @param request
     * @param param
     * @return
     */
    public String uploadFile2ImageServer(String file, HttpServletRequest request,
                                         Map<String, String> param) {
        return uploadFile2ImageServer(file, request, null, null, param);
    }
    
    /**
     * 上傳至圖片服務器,不指定圖片寬高,不剪裁圖片
     * @param file
     * @param param
     * @return
     */
    public String uploadFile2ImageServer(MultipartFile file, Map<String, String> param) {
    		uploadFile(getTempFile(file), "pic", COMMON_IMAGE_UPLOAD_PATH, param);
		if (result != null && !"".equals(result)) {
			return result.replaceAll("\\\\", "/");
		}
		return null;
    }
    

    /**
     * 上傳圖片到圖片服務器,根據指定寬高剪裁圖片
     * @param file
     * @param request
     * @param width
     * @param height
     * @param params
     * @return
     */
    public String uploadFile2ImageServer(String file, HttpServletRequest request, String width,
                                         String height, Map<String, String> params) {
        if (width != null && height != null) {
            params.put("pic_width", width);
            params.put("pic_height", height);
        }
        uploadFile(getTempFile(request, file), "pic", COMMON_IMAGE_UPLOAD_PATH, params);
        if (result != null && !"".equals(result)) {
            return result.replaceAll("\\\\", "/");
        }
        return null;

    }

    /**
     * UEditor 上傳圖片
     * @param file 需要上傳的圖片
     * @param request
     * @return 圖片服務器圖片的URL
     */
    public String uEditorUploaderImage(File file, HttpServletRequest request) {
        String fileKey = "pic";
        Map<String, String> params = new HashMap<String, String>();
        params.put(ConstantsEJS.SELLER_ID, "1");

        uploadFile(file, fileKey, UTLPATH_IMAGE_UEDITOR, params);
        return result;
    }
    
    /**
     * 通過圖片服務器地址 上傳圖片
     * @param file 需要上傳的圖片
     * @param RequestURL 圖片服務器地址
     * @param request
     * @return 圖片服務器圖片的URL
     */
    public String uploaderFileByRequestURL(File file,String fileKey,String RequestURL, HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        params.put(ConstantsEJS.SELLER_ID, "1");
        uploadFile(file, fileKey, RequestURL, params);
        return result;
    }

    /**
     * 上傳文件到服務器本地
     * @param request
     * @param formFile 表單的值 -->頁面input 提交的file
     * @param savePath 保存路徑
     * @return
     */
    public Map<String, Object> uploadFile2LocServer(HttpServletRequest request, String formFile,
                                                    String savePath) {

        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        //表單文件流
        CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest.getFile(formFile);

        //擴展名
        String extend = file.getOriginalFilename()
            .substring(file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase();

        //保存路徑:服務器項目根目錄
        String saveFilePath = request.getServletContext().getRealPath("/") + savePath;

        //統一所有路徑符號
        saveFilePath = saveFilePath.replaceAll("\\\\", "/");

        //返回信息集合
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            //隨機生成文件名
            String saveFileName = UUID.randomUUID().toString() + "." + extend;

            if ((file != null) && (!file.isEmpty())) {
                //文件大小
                float fileSize = Float.valueOf(file.getSize()).floatValue();

                File path = new File(saveFilePath);
                if (!path.exists()) {
                    //創建虛擬目錄
                    path.mkdirs();
                }
                //保存文件
                saveFile2Loca(file, saveFilePath, saveFileName);

                //如果是圖片,則存儲其大小信息
                if (isImg(extend)) {
                    File img = new File(saveFilePath + "/" + saveFileName);
                    BufferedImage bis = ImageIO.read(img);
                    int w = bis.getWidth();
                    int h = bis.getHeight();
                    map.put("width", Integer.valueOf(w));
                    map.put("height", Integer.valueOf(h));
                }
                map.put("mime", extend);
                map.put("fileName", saveFileName);
                map.put("fileSize", Float.valueOf(fileSize));
                map.put("oldName", file.getOriginalFilename());
                map.put("fileAbsolutePath", saveFilePath + "/" + saveFileName);
                map.put("filePath", savePath + "/" + saveFileName);
            } else {
                map.put("width", Integer.valueOf(0));
                map.put("height", Integer.valueOf(0));
                map.put("mime", "");
                map.put("fileName", "");
                map.put("fileSize", Float.valueOf(0.0F));
                map.put("oldName", "");
                map.put("fileAbsolutePath", "");
                map.put("filePath", "");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return map;
    }

    /**
     * 保存文件到服務器本地
     * @param file
     * @param saveFilePath
     * @param saveFileName
     */
    private void saveFile2Loca(CommonsMultipartFile file, String saveFilePath,
                               String saveFileName) {
        InputStream is = null;
        DataOutputStream out = null;
        try {
            out = new DataOutputStream(
                new FileOutputStream(saveFilePath + File.separator + saveFileName));
            is = file.getInputStream();
            int size = Integer.valueOf((int) file.getSize());
            byte[] buffer = new byte[size];
            while (is.read(buffer) > 0) {
                out.write(buffer);
            }
        } catch (IOException exception) {
            exception.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 是否是圖片
     * @param extend
     * @return
     */
    public static boolean isImg(String extend) {
        boolean ret = false;
        List<String> list = new ArrayList<String>();
        list.add("jpg");
        list.add("jpeg");
        list.add("bmp");
        list.add("gif");
        list.add("png");
        list.add("tif");
        for (String s : list) {
            if (s.equals(extend)) {
                ret = true;
            }
        }
        return ret;
    }

    /**
     * 上傳圖片到圖片服務器
     * @param file
     * @param request
     * @param width
     * @param height
     * @param param
     * @return
     */
    public String advUploadFile2ImageServer(String file, HttpServletRequest request) {
        advUploaderImage(getTempFile(request, file), request, true);
        if (result != null && !"".equals(result)) {
            return result.replaceAll("\\\\", "/");
        }
        return null;
    }

    /**
     * 從表單文件流中讀出文件
     * @param request
     * @param file
     * @return
     */
    private File getTempFile(HttpServletRequest request, String file) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        //表單文件流
        CommonsMultipartFile multipartFile = (CommonsMultipartFile) multipartRequest.getFile(file);
        File tmpFile = null;
        try {
            if (null != multipartFile && multipartFile.getSize() > 0) {
                //擴展名
                String extend = multipartFile.getOriginalFilename()
                    .substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1)
                    .toLowerCase();
                //隨機生成文件名
                String saveFileName = UUID.randomUUID().toString() + "." + extend;
                //TODO上傳圖片修改
                tmpFile = new File(buildImgPath(request) + "/" + saveFileName);
                if (!multipartFile.isEmpty()) {
                    byte[] bytes = multipartFile.getBytes();
                    BufferedOutputStream stream = new BufferedOutputStream(
                        new FileOutputStream(tmpFile));
                    stream.write(bytes);
                    stream.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tmpFile;
    }

    /**
     * 從表單文件流中讀出文件
     * @param request
     * @param file
     * @return
     */
    public static File getTempFileByOriginalFileName(HttpServletRequest request, String file) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        //表單文件流
        CommonsMultipartFile multipartFile = (CommonsMultipartFile) multipartRequest.getFile(file);
        File tmpFile = null;
        try {
            if (null != multipartFile && multipartFile.getSize() > 0) {
                //TODO上傳圖片修改
                tmpFile = new File(UploadUtil.buildImgPath(request) + "/" + multipartFile.getOriginalFilename());
                if (!multipartFile.isEmpty()) {
                    byte[] bytes = multipartFile.getBytes();
                    BufferedOutputStream stream = new BufferedOutputStream(
                            new FileOutputStream(tmpFile));
                    stream.write(bytes);
                    stream.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tmpFile;
    }

    /**
     * 從表單文件流中讀出文件
     * @param request
     * @param file
     * @return
     */
    private File getTempFile(MultipartFile file) {
        File tmpFile = null;
        CommonsMultipartFile multipartFile = (CommonsMultipartFile)file;
        try {
            if (null != multipartFile && multipartFile.getSize() > 0) {
                //擴展名
                String extend = multipartFile.getOriginalFilename()
                    .substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1)
                    .toLowerCase();
                //隨機生成文件名
                String saveFileName = UUID.randomUUID().toString() + "." + extend;
                //TODO上傳圖片修改
                String path = ((DiskFileItem) multipartFile.getFileItem()).getStoreLocation().getParentFile().getPath();
                tmpFile = new File(path+"/" + saveFileName);
                if (!file.isEmpty()) {
                    byte[] bytes = file.getBytes();
                    BufferedOutputStream stream = new BufferedOutputStream(
                        new FileOutputStream(tmpFile));
                    stream.write(bytes);
                    stream.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tmpFile;
    }

    /**
     * 構建圖片上傳路徑
     * @param request
     * @return
     */
    @SuppressWarnings("deprecation")
    public static String buildImgPath(HttpServletRequest request) {
        String path = "upload";
        SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");
        path += "/" + formater.format(new Date());
        path = request.getRealPath(path);
        File dir = new File(path);
        if (!dir.exists()) {
            try {
                dir.mkdirs();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return path;
    }

    /**
     * 品牌上傳
     * @param file 上圖的圖片
     * @param request 請求的路徑
     * @param flag:
     *          <li>true:平臺上傳;</li>
     *          <li>false:商家上傳;</li>
     * @return
     */
    public String brandUploaderImage(File file, HttpServletRequest request, boolean flag) {
        String fileKey = "pic";
        Map<String, String> params = new HashMap<String, String>();
        if (flag) {
            params.put(ConstantsEJS.BRAND, ConstantsEJS.BRAND);
        } else {
            //params.put(ConstantsJM.SELLER_ID, WebSellerSession.getAdminUser(request).getId() + "");
        }
        uploadFile(file, fileKey, BRAND_IMAGE_PATH, params);
        return result;
    }

    /**
     * 品廣告上傳
     * @param file 上圖的圖片
     * @param request 請求的路徑
     * @param flag:
     *          <li>true:平臺上傳;</li>
     *          <li>false:商家上傳;</li>
     * @return
     */
    public String advUploaderImage(File file, HttpServletRequest request, boolean flag) {
        String fileKey = "pic";
        Map<String, String> params = new HashMap<String, String>();
        if (flag) {
            params.put(ConstantsEJS.AD_FRONT, ConstantsEJS.AD_FRONT);
        } else {
            //params.put(ConstantsJM.SELLER_ID, WebSellerSession.getAdminUser(request).getId() + "");
        }
        uploadFile(file, fileKey, ADV_IMAGE_PATH, params);
        return result;
    }

    /**
     * 上傳文件
     * @param file 需要上傳的文件
     * @param fileKey 在網頁上<input type=file name=xxx/> xxx就是這裏的fileKey
     * @param RequestURL 請求的URL
     * @param param 傳遞參數
     */
    public void uploadFile(File file, String fileKey, String RequestURL,
                           Map<String, String> param) {
        if (file == null || (!file.exists())) {
            return;
        }

        requestTime = 0;

        long requestTime = System.currentTimeMillis();
        long responseTime = 0;

        try {
            URL url = new URL(RequestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(readTimeOut);
            conn.setConnectTimeout(connectTimeout);
            conn.setDoInput(true); // 允許輸入流
            conn.setDoOutput(true); // 允許輸出流
            conn.setUseCaches(false); // 不允許使用緩存
            conn.setRequestMethod("POST"); // 請求方式
            conn.setRequestProperty("Charset", CHARSET); // 設置編碼
            conn.setRequestProperty("connection", "keep-alive");
            conn.setRequestProperty("user-agent",
                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
            //			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            /**
             * 當文件不爲空,把文件包裝並且上傳
             */
            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
            StringBuffer sb = null;
            String params = "";

            /***
             * 以下是用於上傳參數
             */
            if (param != null && param.size() > 0) {
                Iterator<String> it = param.keySet().iterator();
                while (it.hasNext()) {
                    sb = null;
                    sb = new StringBuffer();
                    String key = it.next();
                    String value = param.get(key);
                    sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
                    sb.append("Content-Disposition: form-data; name=\"").append(key).append("\"")
                        .append(LINE_END).append(LINE_END);
                    sb.append(value).append(LINE_END);
                    params = sb.toString();
                    dos.write(params.getBytes());
                    //					dos.flush();
                }
            }

            sb = null;
            params = null;
            sb = new StringBuffer();

            sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
            sb.append("Content-Disposition:form-data; name=\"" + fileKey + "\"; filename=\""
                      + file.getName() + "\"" + LINE_END);
            sb.append("Content-Type:image/pjpeg" + LINE_END); // 這裏配置的Content-type很重要的 ,用於服務器端辨別文件的類型的
            sb.append(LINE_END);
            params = sb.toString();
            sb = null;

            dos.write(params.getBytes());
            /**上傳文件*/
            InputStream is = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = is.read(bytes)) != -1) {
                dos.write(bytes, 0, len);
            }
            is.close();

            dos.write(LINE_END.getBytes());
            byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
            dos.write(end_data);
            dos.flush();

            /**
             * 獲取響應碼 200=成功 當響應成功,獲取響應的流
             */
            int res = conn.getResponseCode();
            responseTime = System.currentTimeMillis();
            requestTime = (int) ((responseTime - requestTime) / 1000);

            //刪除臨時文件
            file.delete();

            if (res == 200) {
                InputStream input = conn.getInputStream();
                StringBuffer sb1 = new StringBuffer();
                int ss;
                while ((ss = input.read()) != -1) {
                    sb1.append((char) ss);
                }
                result = sb1.toString();
            }
            return;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }

    /**
     * 遞歸刪除指定目錄的所有文件
     * @param dir
     * @return
     */
    public static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //遞歸刪除目錄中的子目錄下
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目錄此時爲空,可以刪除
        return dir.delete();
    }

    public int getReadTimeOut() {
        return readTimeOut;
    }

    public void setReadTimeOut(int readTimeOut) {
        this.readTimeOut = readTimeOut;
    }

    public int getConnectTimeout() {
        return connectTimeout;
    }

    public void setConnectTimeout(int connectTimeout) {
        this.connectTimeout = connectTimeout;
    }

    /**
     * 獲取上傳使用的時間
     * @return
     */
    public static int getRequestTime() {
        return requestTime;
    }

    public String getResult() {
        return result;
    }

    /**
     * 移動端首頁上傳圖片
     * @param file
     * @param request
     * @return
     */
    public String mIndexUploadFile2ImageServer(String file, HttpServletRequest request) {
        mIndexUploaderImage(getTempFile(request, file), request);
        if (result != null && !"".equals(result)) {
            return result.replaceAll("\\\\", "/");
        }
        return null;
    }

    /**
     * @param file 上圖的圖片
     * @param request 請求的路徑
     * @return
     */
    public String mIndexUploaderImage(File file, HttpServletRequest request) {
        String fileKey = "pic";
        Map<String, String> params = new HashMap<String, String>();
        params.put(ConstantsEJS.AD_MOBILE, ConstantsEJS.AD_MOBILE);
        uploadFile(file, fileKey, M_INDEX_IMAGE_PATH, params);
        return result;
    }

    /**
     * 快遞模板上傳圖片
     * @param file
     * @param request
     * @return
     */
    public String courierUploadFile2ImageServer(String file, HttpServletRequest request) {
        courierUploaderImage(getTempFile(request, file), request);
        if (result != null && !"".equals(result)) {
            return result.replaceAll("\\\\", "/");
        }
        return null;
    }

    /**
     * @param file 上圖的圖片
     * @param request 請求的路徑
     * @return
     */
    public String courierUploaderImage(File file, HttpServletRequest request) {
        String fileKey = "pic";
        Map<String, String> params = new HashMap<String, String>();
        params.put(ConstantsEJS.COURIER_COMPANY, ConstantsEJS.COURIER_COMPANY);
        uploadFile(file, fileKey, COURIER_COMPANY_IMAGE_PATH, params);
        return result;
    }

}

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