我想從我的Android應用上傳一個位圖到我的NodeJS服務器。我的位圖有一些數據(Json)必須在相同的(POST)消息中上傳。我看到它可能通過:Android:用json上傳圖片
- 多部分表單數據。
- 應用端的圖像編碼(將圖像轉換爲字符串)以及服務器端的解碼。
有沒有更好的方法?有沒有人熟悉一個很好的指導來執行這種上傳?
我想從我的Android應用上傳一個位圖到我的NodeJS服務器。我的位圖有一些數據(Json)必須在相同的(POST)消息中上傳。我看到它可能通過:Android:用json上傳圖片
有沒有更好的方法?有沒有人熟悉一個很好的指導來執行這種上傳?
感謝您的回覆。這是我爲Multipart上傳所寫的代碼(合併了幾個答案)。如果代碼有問題,請告訴我。
// create a url object
URL url = new URL(mGlobalUrl + localUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());
//--start--
//Deal with data
outputStream.writeBytes(twoHyphens + boundary + lineEnd); //key
outputStream.writeBytes("Content-Disposition: form-data; name=\"key\"" + lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(value); //value
outputStream.writeBytes(lineEnd);
//Deal with image
outputStream.writeBytes(twoHyphens + boundary + lineEnd); //key
outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadFile\"; filename=\"" + "image1" + "\"" + lineEnd);
//outputStream.writeBytes("Content-Type: " + fileMimeType + lineEnd);
outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd);
outputStream.writeBytes(lineEnd);
FileInputStream fileInputStream = new FileInputStream(imagePath); //value
int bytesAvailable = fileInputStream.available();
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
//--end--
// receive response as inputStream
int responseCode = conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
inputStream = new BufferedInputStream(conn.getInputStream());
// convert input stream to string
if (inputStream != null) {
result = convertInputStreamToString(inputStream);
}
else {
Log.d(TAG, "sendPostRequest: Error - input stream is null");
result = "{}";
}
}
fileInputStream.close();
outputStream.flush();
outputStream.close();
conn.disconnect();
對於服務器端(的NodeJS)我用強大的模塊(我不知道是否已經過時或不),你可以找到關於此模式here一些更多的信息。
upload_image = function(req, res, next) {
//create new incoming form object
var form = new formidable.IncomingForm();
//parse the request using formidable module
form.parse(req, function(error, fields, files) {
//check if error occurred during the parse
if (error) {
...some code
return;
}
//save the data received in the request
...some code
});
//check for errors during the transmission
form.on('error', function(err) {
...some code
return;
});
//check for the end of the transmission
form.on('end', function(error, fields, files) {
//save the temporary location of the uploaded image file
var temp_path = this.openedFiles[0].path;
//save the file name of the uploaded image file
var file_name = this.openedFiles[0].name;
//save the file
...some code
//update the database
...some code
};
嘿@MaxZ請問你如何處理圖像的代碼?可以很好地知道你使用了哪個庫,因爲大量的庫存在,但其中大多數都有不推薦使用的方法並與android本機衝突。 – nsgulliver
@nsgulliver完成。 –
圖像編碼可能會產生一個非常大的字符串,它會比原始圖像更大,在我看來,多部分表單數據是要走的路。 –
@ Boldijar Paul我應該使用MultipartEntity對象還是常規的DataOutputStream? –
你可以自己編碼。或者在本網站上找到現成的代碼。或者使用一個庫。如果你想使用json(就像你在主題中所說的那樣),你不能使用multipart,而必須對圖像數據base64進行編碼,這會增加30%的大小。 – greenapps