multipart/form-data圖片上傳實現方法(上傳檔案到Nimg)
在實現multipart/form-data的圖片上傳時,需要用\r\n來分隔每一行,在JAVA中實現multipart/form-data的圖片上傳時則可以使用System.getProperty("line.separator")來進行每一行的分割。但是如果要將程式碼用於Android中,則切記不能使用System.getProperty("line.separator")來進行每一行的分割,因為在Android中System.getProperty("line.separator")的結果是\n,在JAVA中則是\r\n。
故不推薦大家使用System.getProperty("line.separator"),會出現一些意想不到的問題,並且出現這些問題還不易追溯到System.getProperty("line.separator")的使用上來。
下面貼上JAVA和Android都可使用的上傳程式碼,改程式碼是針對Nimg實現,如需要使用與其他環境,則針對環境更改“上傳引數”處程式碼即可。
UploadImage.java
package cloud.test;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;
/**
* 圖片上傳
* @author Cloud
* @version 1.0
*/
public class UploadImage {
private static final String MULTIPART_FORM_DATA="multipart/form-data";
private static final String TWOHYPHENS = "--" ;
private static final String BOUNDARY = "---------------------------"+UUID.randomUUID();
private static final String LINEEND = "\r\n";
private static final String FORMNAME="userfile";
private String actionUrl;
private int timeout;
private String fileName;
private byte[] data;
private String imageType;
/**
* 初始化圖片上傳工具
* @param actionUrl - 圖片儲存地址
* @param timeout - 圖片上傳超時時間 (毫秒)
*/
public UploadImage(String actionUrl,int timeout){
this.actionUrl=actionUrl;
this.timeout=timeout;
}
/**
* 設定上傳內容
* @param fileName - 圖片名稱
* @param data - 圖片內容
* @param imageType - 圖片格式
*/
public void setData(String fileName,byte[] data,ImageType imageType) throws Exception{
this.fileName=fileName;
this.data=data;
this.imageType=imageType.getValue();
if(imageType!=null){
String extension =imageType.getValue().substring(imageType.getValue().indexOf("/")+1, imageType.getValue().length());
this.fileName=fileName+"."+extension;
}
}
/**
* 上傳
* @return - 格式<br/>
* {<br/>
* "code": 200,<br/>
* "msg": "upload success!",<br/>
* "data": {<br/>
* "t": "png",<br/>
* "userpath": "01",<br/>
* "md5": "6f8b47ec3b8ea08335cb6e13cbbe96dc",<br/>
* "url": "01/6f8b47ec3b8ea08335cb6e13cbbe96dc.png"<br/>
* }<br/>
* }<br/>
*/
public String upload(){
return upload(null,null);
}
/**
* 上傳
* @param actType - 圖片處理命令
* @param param - 圖片處理引數
* @return - 格式<br/>
* {<br/>
* "code": 200,<br/>
* "msg": "upload success!",<br/>
* "data": {<br/>
* "t": "png",<br/>
* "userpath": "01",<br/>
* "md5": "6f8b47ec3b8ea08335cb6e13cbbe96dc",<br/>
* "url": "01/6f8b47ec3b8ea08335cb6e13cbbe96dc.png"<br/>
* }<br/>
* }<br/>
*/
public String upload(ActType actType,String param){
HttpURLConnection conn = null;
DataOutputStream output = null;
BufferedReader input = null;
try {
URL url = new URL(actionUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(timeout);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "keep-alive");
conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY);
conn.connect();
output = new DataOutputStream(conn.getOutputStream());
StringBuilder sb = new StringBuilder();
if(actType!=null&¶m!=null){
/**
* 上傳引數
*/
sb.append(TWOHYPHENS + BOUNDARY + LINEEND);
sb.append("Content-Disposition: form-data; name=\"act\"" + LINEEND);
sb.append(LINEEND);
sb.append(actType.getValue() + LINEEND);
output.writeBytes(sb.toString());
sb = new StringBuilder();
sb.append(TWOHYPHENS + BOUNDARY + LINEEND);
sb.append("Content-Disposition: form-data; name=\"param\"" + LINEEND);
sb.append(LINEEND);
sb.append(param + LINEEND);
output.writeBytes(sb.toString());
}
/**
* 上傳圖片
*/
sb = new StringBuilder();
sb.append(TWOHYPHENS + BOUNDARY + LINEEND);
sb.append("Content-Disposition: form-data; name=\"" + FORMNAME + "\"; filename=\"" + fileName + "\"" + LINEEND);
sb.append("Content-Type: " + imageType + LINEEND);
sb.append(LINEEND);
output.writeBytes(sb.toString());
output.write(data, 0, data.length);
output.writeBytes(LINEEND);
/**
* 上傳結束
*/
output.writeBytes(TWOHYPHENS + BOUNDARY + TWOHYPHENS + LINEEND);
output.flush();
/**
* 返回資訊
*/
int code = conn.getResponseCode();
System.out.println(code);
if (code != 200) {
throw new RuntimeException("請求'" + actionUrl + "'失敗!");
}
input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String oneLine;
while ((oneLine = input.readLine()) != null) {
response.append(oneLine + LINEEND);
}
return response.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (output != null) {
output.close();
}
if (input != null) {
input.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
if (conn != null) {
conn.disconnect();
}
}
}
}
ActType.java
package cloud.test;
/**
* 影象上傳命令
* @author Cloud
* @version 1.0
*/
public enum ActType {
/**
* 旋轉
*/
ROTATE("rotate"),
/**
* 裁剪
*/
CROP("crop"),
/**
* 縮放
*/
RESIZE("resize");
private String value;
privateActType(String value) {
this.value=value;
}
public String getValue() {
return value;
}
}
ImageType.java
package cloud.test;
/**
* 圖片格式
* @author Cloud
* @version 1.0
*/
public enum ImageType {
/**
* JPG格式
*/
JPG("image/jpg"),
/**
* PNG格式
*/
PNG("image/png"),
/**
* GIF格式
*/
GIF("image/gif"),
/**
* JPEG格式
*/
JPEG("image/jpeg");
private String value;
privateImageType(String value) {
this.value=value;
}
public String getValue() {
return value;
}
}
相關推薦
multipart/form-data圖片上傳實現方法(上傳檔案到Nimg)
在實現multipart/form-data的圖片上傳時,需要用\r\n來分隔每一行,在JAVA中實現multipart/form-data的圖片上傳時則可以使用System.getProperty("line.separator")來進行每一行的分割。但是如果要將程式碼用於Android中
Android模擬 HTTP multipart/form-data 請求協議資訊實現圖片上傳
轉自:http://www.linuxidc.com/Linux/2011-08/41944.htm 問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用
Android HTTP multipart/form-data 請求協議資訊實現圖片上傳
問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用Android的HTTPConnection/ ApacheHTTP 通過POST 和GET的方式就實現不了
騰訊雲OCR身份證識別 multipart/form-data和application/json 格式方法實現
鑑權簽名方法類: package com.x.common.utils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; import java.util.R
Atitit 檔案上傳功能的實現 圖片 視訊 目錄 1. 上傳原理 1 1.1. http post編碼 multipart / form-data 1 1.2. 臨時檔案模式 最簡單 2 1.3
Atitit 檔案上傳功能的實現 圖片 視訊 目錄 1. 上傳原理 1 1.1. http post編碼 multipart / form-data 1 1.2. 臨時檔案模式 最簡單 2 1.3. 位元組陣列模式 簡單 2
[寫著玩]理解multipart/form-data,構造http表單實現android圖片上傳
關於multipart/form-data,可參考https://blog.csdn.net/zshake/article/details/77985757 客戶端 引數解釋,上傳主方法 private void submit() { Map<String, Obj
<form> multipart/form-data 上傳圖片
mbo tar nco 報錯 dial kit [] zip bbc 1 <form method="post" enctype="multipart/form-data" id="fileinfo" name="fileinf
WebApi實現Ajax模擬Multipart/form-data方式多文件上傳
vid 基本 rip err tps del 多文件 delete back 前端頁面代碼: <input type="file" class="file_control" /><br /> <input type="file" cla
新浪釋出帶圖片的微博[multipart/form-data格式上傳檔案]
在使用新浪微博的API更新一條帶圖片的微博時,需要使用multipart/form-data風格的POST 需要在request頭設定Content-type Content-type = multipart/form-data; boundary=xxxx 其中 bou
關於ajax 上傳圖片 enctype="multipart/form-data"的問題
該屬性為提交表單瀏覽器對資料的編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。 當action為get時候,瀏覽器用x-www-form-urlencod
python通過http(multipart/form-data)上傳檔案的方法
之前寫過一篇部落格,說的如何python如何通過http下載檔案,今天寫一篇部落格來介紹如下,python如何通過request庫實現上傳檔案 這裡主要是解決multipart/form-data這種格式的檔案上傳,基本現在http協議上傳檔案基本上都是通過這種格式上傳 一、思路 一般情況下,如果我們往一個地
HTTP multipart/form-data 上傳方式說明(有8個註意點)
ria ubi reference 就會 ros pda www tran cep ( From: http://home.meegoq.com/home-space-do-blog-uid-17-id-81.html ) HTTP multipart/form-data
HTTP使用 multipart/form-data 上傳多個字段(包括文件字節流 octet-stream)
sprintf logs pcs cer lpstr struct written all normal 自己用到的一個向服務器上傳多個字段的實例,代碼不全,僅做參考。 用的是WinINet,上傳的字段中包括文件字節流 /* PHttpRequest中自行組裝body
使用python或robotframework調multipart/form-data接口上傳文件
multipart 比較 分享圖片 方法 更強 構造 ima force ann 這幾天調一個multipart/form-data類型的接口,遇到點小阻礙。之前同事有使用urllib庫寫了個類似的方法實現,比較長,想要改的時候發現不太好使。在網上查找發現用request
PHP中以multipart/form-data上傳文件流
Curl multipart/form-data 上傳類 class UploadPart { protected static $url; protected static $delimiter; protected static $instance; pub
檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的值?
一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:
Multipart/form-data POST檔案上傳
Multipart/form-data POST檔案上傳 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下: <form method="post"action="http://w.sohu.com" >
multipart/form-data檔案上傳
form表單的enctype屬性:規定了form表單資料在傳送到伺服器時候的編碼方式 application/x-www-form-urlencoded:預設編碼方式 multipart/form-data:指定傳輸資料為二進位制資料,例如圖片、mp3、檔案 text/plain:純文字的傳輸
Nginx上傳檔案413錯誤Processing of multipart/form-data request failed. Unexpected EOF read on the socket
問題描述: 利用ajax通過nginx上傳檔案到tomcat時,前端url報413http錯誤。 後臺tomcat控制檯也輸出對應的異常資訊,如下。 解決方法: 新增上傳檔案大小的最大值。 修改nginx的配置檔案:nginx.conf。目錄一般在 /usr/local/n
檔案上傳為什麼要用 enctype="multipart/form-data" ???
在檔案上傳的過程中發現,HTML表單需要設定enctype="multipart/form-data"這個屬性,雖然不這麼設定的確無法上傳,但這是為什麼呢? HTML表單如何打包資料檔案是由enctype這個屬性決定的。enctype有以下幾種取值: application/x-ww