6

peut vous expliquer pourquoi le client android analyser les données multiparform pour le chat non ascii. tout chargement de fichier de travail en utilisant un bon postier ici est mon app.js Codeclient android analyser les données de formulaire non à multipart 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); 

et apiRoutes le point ma fonction de téléchargement contient impression simple req param.using postier faire fonctionner une bonne réponse

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' } } 

voici mon code client Android (Notez ce code de travail de fichier avec php $ _FILE mais ne fonctionne pas avec express)

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

en utilisant Android cette émission Filaire comme ci-dessous

 

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�' } 

J'ai aussi essayé multer et d'autres gestionnaire mais multipart prenant note des travaux. s'il vous plaît aidez-moi à sortir de cet enfer

+0

Peut-être qu'il est utile https://github.com/koush/ion –

Répondre

2

Il semble que la réponse du serveur est codée comme UTF-8. Pour vous décoder et lire correctement essayer pourrait

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

Spécification de la partie codante du InputStreamReader va décoder et lire le flux en utilisant schéma de codage spécifié, qui dans ce cas est UTF-8. Vérifiez le javadocs pour plus de détails.

0

Vous devez allouer un tampon à nouveau en fonction de la nouvelle taille de bufferSize, j'ai révisé le code ci-dessous:

// 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

clairement un problème de codage et non réponse partielle lue à partir du serveur. ceci est une correction inappropriée –

0

soumission du formulaire multipart enlève beaucoup de l'ambiguïté que pour cent codage avait: le serveur Maintenant, il est possible de demander explicitement certains encodages, et le client peut explicitement dire au serveur lors de la soumission du formulaire quel est le codage des champs.

Vous pouvez utiliser cette fonctionnalité de deux façons: laissez-la désactivée et faites envoyer le navigateur. le même codage que la page, ou le définir à UTF-8, puis faire une autre conver côté serveur. Chaque méthode a des lacunes, en particulier le premier.

Si vous dites au navigateur d'envoyer le formulaire dans le même codage que la page, vous avez encore la peine de savoir quoi faire avec des personnages qui sont en dehors de la plage du codage des caractères. Le comportement, encore une fois, varie: Firefox 2.0 les convertit en références d'entités de caractères tandis qu'Internet Explorer 7.0 les gomme au-delà de l'intelligibilité. Pour des raisons sérieuses d'internationalisation, ce n'est pas une option.

L'autre possibilité est de régler Accept-Encoding à UTF-8, ce qui soulève la question suivante: Pourquoi n'utilisez-vous pas UTF-8 pour tout alors? Cette route est plus acceptable, mais il y a une mise en garde notable: vos données venir en UTF-8, de sorte que vous devrez convertir explicitement dans l'encodage de caractère local privilégié.

Un encodage à base Unicode tels que UTF-8 peut prendre en charge plusieurs langues et peut accueillir des pages et des formes dans tout mélange de ces langues. Son utilisation élimine également la nécessité d'une logique côté serveur pour déterminer individuellement le codage de caractères pour chaque page servi ou chaque envoi de formulaire entrant. Cela réduit considérablement la complexité de traiter avec un site ou une application multilingue.

Un encodage Unicode permet également de mélanger beaucoup plus de langues sur une seule page que tout autre choix de codage.

ont regard sur Why UTF-X

+0

La réponse sur l'androïde montre des codes char utf. ce qui signifie que le serveur utilise en fait le codage utf pour écrire la réponse. Le problème est dans la fonction client pour lire les données. Les données en cours de lecture ne sont pas décodées à l'aide de utf. Si vous avez seulement regardé le code –