ありがとうございました。これは、マルチパートアップロードのために書いたコードです(いくつかの回答のマージ)。コードに問題がある場合は、教えてください。サーバ側(NodeJS)については
// 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();
私は強敵モジュールを使用(私はそれは廃止されているかどうかわからない)、あなたはこのモード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
};
イメージエンコーディングは非常に大きな文字列を作成する可能性があり、私の意見ではマルチパートフォームデータが元のイメージよりも大きくなります。 –
@ Boldijar Paul私はMultipartEntityオブジェクトを使うべきですか、通常のDataOutputStreamだけを使うべきですか? –
自分ですべてをコーディングすることができます。または、このサイト全体の準備ができたコードを見つけてください。または、ライブラリを使用します。 jsonを使用したい場合(あなたが言うように)、multipartを使うことはできず、画像データbase64をエンコードしなければならず、サイズは30%増加します。 – greenapps