2017-01-21 10 views
6

вы можете объяснить, почему андроид-клиент обрабатывает многофакторные данные в чате без ascii. во время загрузки файла хорошо работает с помощью почтальона вот мой app.js кодандроид-клиент разобрать данные о множественной форме для не ascii

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 указывают моя функция загрузки содержит простой печати REQ param.using почтальона он работает хорошо

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); 
    } 
} 

с помощью андроида этого шоу проводного ответа, как показано ниже

 

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 и другой многослойного обработчик, но, отметив работу. , пожалуйста, помогите мне выйти из этого ада

+0

Может быть, это полезно https://github.com/koush/ion –

ответ

2

Кажется, ответ сервера закодирован как UTF-8. Для того, чтобы правильно расшифровать и прочитать можно попробовать

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

Указание кодировки части к InputStreamReader будет декодировать и читать поток, используя указанную схему кодирования, которая в данном случае является UTF-8. Подробнее см. В файле javadocs.

0

Вам нужно выделить буфер снова на основе нового размера 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); 

} 
+0

ясно, что это проблема кодирования, а не частичный ответ чтения с сервера. это неуместное исправление –

0

Multipart форма представления отнимает много двусмысленности, что процент кодирование имело: сервер теперь может явно запрашивать определенные кодировки, и клиент может явно указать серверу во время отправки формы, в какой кодировке находятся поля.

Существует два способа использования этой функции: оставьте ее незамкнутой и отправьте браузер ту же кодировку, что и страница, или установить ее в UTF-8, а затем выполнить другое преобразование sion server-side. У каждого метода есть недостатки, особенно первые.

Если вы сообщите обозревателю, чтобы отправить форму в той же кодировке, что и страница, у вас все еще есть проблема с тем, что делать с символами, находящимися за пределами диапазона кодировки символов. Поведение, опять же, меняется: Firefox 2.0 преобразует их в ссылки на сущности символов, в то время как Internet Explorer 7.0 управляет ими без разборчивости. Для серьезных целей интернационализации это не вариант.

Другая возможность заключается в установке Accept-Encoding на UTF-8, которая задает вопрос: почему вы не используете UTF-8 для всего этого? Этот маршрут более приятный, но есть заметная оговорка: ваши данные появятся как UTF-8, поэтому вам придется явно преобразовать их в предпочитаемую локальную кодировку.

Кодировка на основе Юникода, такая как UTF-8, может поддерживать многие языки и может размещать страницы и формы в любой смеси этих языков. Его использование также устраняет необходимость в серверной логике для индивидуального определения кодировки символов для каждой обслуживаемой страницы или для каждой входящей формы. Это значительно снижает сложность работы с многоязычным сайтом или приложением.

Кодировка в формате Юникод также позволяет смешивать еще несколько языков на одной странице, чем любой другой вариант кодирования.

имеют вид на Why UTF-X

+0

Ответ на андроид показывает коды utf. что означает, что сервер на самом деле использует utf-кодирование для записи ответа. Проблема заключается в функции клиента для чтения данных. Чтение данных не выполняется с помощью utf. Если бы вы только взглянули на код –