你能解释为什么android客户端将多重数据解析为非ascii聊天.虽然文件上传工作好使用postman这里是我的app.js代码
var multipart = require('connect-multiparty'); var apiRoutes = require('./routes/apiRoutes'); app.set('views', path.join(__dirname, 'views')); app.use(logger('dev')); app.use(bodyParser.json({limit: '50mb'})); app.use(bodyParser.urlencoded([{extended: false},{ uploadDir:path.join(__dirname, 'uploads') }, {parameterLimit:100000}, {limit: '50mb'}])); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'uploads'))); app.use(multipart()); app.use(apiRoutes);
和apiRoutes指向我的上传功能包含简单的print req param.using postman它工作得很好
console.log("mediaChat called", req.body, req.files);
响应
mediaChat called { apiKey: '123' } { media: { fieldName: 'media', originalFilename: 'default.png', path: '/tmp/KFnwsKGp-f4woTaBH6aPR-qa.png', headers: { 'content-disposition': 'form-data; name="media"; filename="default.png"', 'content-type': 'image/png' }, size: 716, name: 'default.png', type: 'image/png' } }
这是我的android客户端代码(注意这个代码工作文件与php $ _FILE但不使用快递)
com.info.acruss.wave; import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; /** * Created by Naitik on 9/20/2016. */ public class UploadImage extends AsyncTask{ String CallingURL; URL url; OnTaskCompleted myListener; private static final String TAG = "UploadImage"; int timeoutMilli = 60000; String sourceFileUri; String ApiKey,Type; public UploadImage(String sourceFileUri, String URL,String apiKey, String type, OnTaskCompleted listener) { Log.e("Uploading", "API:" + URL); this.sourceFileUri = sourceFileUri; this.CallingURL = URL; this.myListener = listener; this.ApiKey=apiKey; this.Type=type; try { url = new URL(CallingURL); Log.e(TAG, "Url : " + CallingURL); } catch (MalformedURLException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void... params) { String fileName = sourceFileUri; HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 10 * 1024 * 1024; File sourceFile = new File(sourceFileUri); if (!sourceFile.isFile()) { Log.e("UploadImage", "Source File Does not exist"; return null; } String serverResponseMessage = ""; try { // open a URL connection to the Servlet FileInputStream fileInputStream = new FileInputStream(sourceFile); URL url = new URL(CallingURL); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); // Allow Inputs conn.setDoOutput(true); // Allow Outputs conn.setUseCaches(false); // Don't use a Cached Copy conn.setRequestMethod("POST"; conn.setReadTimeout(timeoutMilli); conn.setConnectTimeout(timeoutMilli); conn.setRequestProperty("Connection", "Keep-Alive"; conn.setRequestProperty("ENCTYPE", "multipart/form-data"; conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); conn.setRequestProperty("media", fileName); conn.setRequestProperty("apiKey",ApiKey); conn.setRequestProperty("media_type",Type); conn.setRequestProperty("media", fileName); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name='media';filename='" + fileName + "'" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) int serverResponseCode = conn.getResponseCode(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = ""; StringBuilder responseOutput = new StringBuilder(); while ((line = br.readLine()) != null) { responseOutput.append(line); } br.close(); serverResponseMessage = responseOutput.toString();//output.toString(); Log.e("uploadFile", "HTTP Response is : " + serverResponseMessage); if (serverResponseCode == 200) { //status code 200 //status ok } //close the streams // fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { ex.printStackTrace(); Log.e("Upload file to server", "error: " + ex.getMessage(), ex); } catch (Exception e) { Log.e("Upload file to server", "error: " + e.getMessage(), e); e.printStackTrace(); } return serverResponseMessage; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); Log.e("Result", "" + result); if (myListener != null) if (result != null) { myListener.onFileUploadComplete(result); } else { myListener.onFileUploadComplete(""; } } public interface OnTaskCompleted { void onFileUploadComplete(String result); } }
使用android这个显示有线响应如下
mediaChat called { null: '????\u0000\u0010JFIF\u0000\u0001\u0001\u0000\u0000\u0001\u0000\u0001\u0000\u0000??\u0000C\u0000\u0010\u000b\f\u000e\f\n\u0010\u000e\r\u000e\u0012\u0011\u0010\u0013\u0018(\u001a\u0018\u0016\u0016\u00181#%\u001d(:3=Mqypdx\\egc??\u0000C\u0001\u0011\u0012\u0012\u0018\u0015\u0018/\u001a\u001a/cB8Bccccccccccc.... ?\u001f.[???_?\u0014)M???XIjX??7?`=?/?8`??ïD?\u0018?D???#?V#q~m?q10L?' }
我也尝试过multer和其他多部分处理程序,但注意到工作.请帮帮我从这个地狱出来