public class FileUploadUtil {
/**
* 將MultipartFile轉成File
* @
* @date 2015-8-25 下午1:52:00
* @param multipartFile
* @return
*/
public static File MultipartFile2File (MultipartFile multipartFile) {
CommonsMultipartFile commonsMultipartFile= (CommonsMultipartFile)multipartFile;
DiskFileItem fileItem = (DiskFileItem)commonsMultipartFile.getFileItem();
return fileItem.getStoreLocation();
}
/**
* 發送圖片上傳的請求,支持數組數據的提交
* @
* @date 2015-8-25 上午11:11:12
* @param url
* @param files
* @param map
* @return
* @throws IOException
*/
public static String commitWithFiles(String url, List<MultipartFile> files, Map<String, String[]> map, String uploadName) {
String result = "";
String boundary = UUID.randomUUID().toString();
if (map == null) {
map = new HashMap<String, String[]>();
}
try {
HttpURLConnection conn = getBaseConnection(url, boundary);
if (null == conn) {
return result;
}
// 連接
conn.connect();
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
//輸出基本參數
writeBaseParam(out, files, map, boundary);
//輸出文件參數
writeFileParam(out, files, boundary, uploadName);
out.flush();
out.close();
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
System.out.println(conn.getResponseCode());
return result;
}
//獲取返回的結果
result= getResult(conn);
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 單個發送圖片上傳的請求,支持數組數據的提交
* @
* @date 2015-8-25 上午11:58:42
* @param url
* @param file
* @param map
* @return
*/
public static String commitWithFile(String url, MultipartFile file, Map<String, String[]> map, String uploadName) {
List<MultipartFile> files = new ArrayList<MultipartFile>();
files.add(file);
return commitWithFiles(url, files, map, uploadName);
}
/**
* 檢驗url地址是否正確
* @
* @date 2015-8-25 上午11:10:50
* @param url
* @return
*/
public static String checkUrl(String url) {
String result = url;
if (url.startsWith("http://")) {
url = url.replaceFirst("http://", "");
if (url.contains("//")) {
url = url.replaceAll("//", "/");
}
result = "http://" + url;
}else{
result = "http://" + url;
}
result = result.replaceAll(":", ":").replaceAll(":", ":").replaceAll(" ", "");
return result;
}
/**
* 根據url獲取連接
*
* @date 2015-8-25 上午11:25:29
* @param url
* @return
*/
private static HttpURLConnection getBaseConnection (String url, String boundary) {
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) (new URL(checkUrl(url)).openConnection());
conn.setReadTimeout(1000000);
conn.setConnectTimeout(1000000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setInstanceFollowRedirects(true);
conn.setChunkedStreamingMode(10240);
conn.setRequestProperty("Charset", "utf-8");
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 輸出基本的參數
* @
* @date 2015-8-25 上午11:32:48
* @param out
* @param files
* @param map
* @param boundary
*/
private static void writeBaseParam (DataOutputStream out, List<MultipartFile> files, Map<String, String[]> map, String boundary) {
// 普通參數
StringBuffer sb = new StringBuffer();
// 文件名稱
for (MultipartFile file : files) {
sb.append("--" + boundary + "\r\n");
sb.append("Content-Disposition: form-data; name=\"uploadFileNames\"\r\n\r\n");
sb.append(file.getName() + "\r\n");
sb.append("--" + boundary + "\r\n");
}
// 其他參數
for (String key : map.keySet()) {
String name = key;
String[] vals = (String[]) map.get(key);
for (String val : vals) {
sb.append("--" + boundary + "\r\n");
sb.append("Content-Disposition: form-data; name=\"" + name
+ "\"\r\n\r\n");
sb.append(val + "\r\n");
sb.append("--" + boundary + "\r\n");
}
}
try {
out.write(sb.toString().getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 輸出文件參數
* @
* @date 2015-8-25 上午11:33:28
* @param out
* @param files
* @param boundary
*/
private static void writeFileParam (DataOutputStream out, List<MultipartFile> files, String boundary, String uploadName) {
FileInputStream in = null;
// 文件
for (MultipartFile file : files) {
StringBuffer strBuffer = new StringBuffer();
strBuffer.append("--" + boundary + "\r\n");
strBuffer.append("Content-Disposition: form-data; name=" + uploadName + "; filename="+ file.getOriginalFilename() + "\r\n");
strBuffer.append("Content-Type: application/octet-stream\r\n");
strBuffer.append("\r\n");
try {
in = new FileInputStream(MultipartFile2File(file));
out.write(strBuffer.toString().getBytes());
byte[] buffer = new byte[1024];
int hasRead = -1;
while ((hasRead = in.read(buffer)) != -1) {
out.write(buffer, 0, hasRead);
}
out.write("\r\n".getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
try {
out.write(("--" + boundary + "--\r\n").getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 獲取上傳返回的結果
* @
* @date 2015-9-7 下午3:41:03
* @param conn
* @return
*/
private static String getResult (HttpURLConnection conn) {
String result = "";
String temp = null;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((temp = reader.readLine()) != null) {
result += temp;
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
調用實例:
public String uploadByHttp(MultipartFile file) {
String fileServer = FilePathListener.getFilePath().get("fileServer");
String url = fileServer + "/fs/file/uploadStr";
Map<String, String[]> map = new HashMap<String, String[]>();
String [] strs = new String[]{UEditorConstant.SAVE_TYPE_UEDITOR};
map.put("type", strs);
String result = FileUploadUtil.commitWithFile(url, file, map, "filedata");
return result;
}