Android客户端parsing多部分表单数据到非ASCII

你能解释为什么Android客户端parsingmultiparform数据非ASCII的聊天。 而在这里使用邮差工作良好的文件是我的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点我的上传function包含简单的打印需求参数使用邮递员工作良好

 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<Void, Void, String> { 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 {null:'u \ u0000 \ u0010JFIF \ u0000 \ u0001 \ u0001 \ u0000 \ u0000 \ u0001 \ u0000 \ u0001 \ u0000 \ u0000 u \ 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)MXIjX7` = /8`ïDʚ\ u0018D·V#Q〜mq10L” }

我也尝试了Muller和其他多部分处理程序,但注意到作品。 请帮我从这个地狱出来

看来服务器响应被编码为UTF-8。 要正确解码和阅读,你可以尝试

 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 

指定InputStreamReader的编码部分将使用指定的编码scheme(在本例中为UTF-8)进行解码和读取。 检查javadocs的细节。

您需要根据bufferSize的新大小再次分配缓冲区,我修改了下面的代码:

 // 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); buffer = null; buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer, 0, bufferSize); } 

多部分表单提交带走了百分比编码所带来的许多含糊之处:服务器现在可以显式地请求某些编码,并且客户端可以在表单提交期间明确地告诉服务器该字段所在的编码。

有两种方法可以使用此function:将其保持不变并使浏览器以与页面相同的编码发送,或将其设置为UTF-8,然后在服务器端执行另一个转换。 每种方法都有不足之处,特别是前者。

如果您告诉浏览器使用与页面相同的编码发送表单,那么对于如何处理字符编码范围之外的字符仍然有困难。 这种行为再一次发生了变化:Firefox 2.0将它们转换为字符实体引用,而Internet Explorer 7.0将其转换为可理解性。 对于严肃的国际化目的,这不是一个select。

另一种可能性是将Accept-Encoding设置为UTF-8,这引出了一个问题:那么为什么不使用UTF-8呢? 这条路线更加可口,但有一个值得注意的警告:你的数据将以UTF-8的forms出现,所以你必须明确地将它转换成你喜欢的本地字符编码。

基于Unicode的编码(如UTF-8)可以支持多种语言,并且可以以任何这些语言的混合来容纳页面和表单。 它的使用还消除了对服务器端逻辑的需要,以单独确定所服务的每个页面或每个传入表单提交的字符编码。 这大大降低了处理多语言网站或应用程序的复杂性。

Unicode编码还允许在单个页面上混合更多的语言,而不是其他任何编码方式。

看看为什么UTF-X