通過HttpURLConnection上傳

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;
	}


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