批量就是可以上傳多張圖片,動態就是不用指定上傳控件的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;
}
}