Android cliente analizar los datos de formulario de multipart a non ascii

¿Puede explicar por qué el cliente de android analiza datos multiparform para no chat ASCII. Mientras que la carga del archivo que trabaja bueno usando el cartero aquí es mi código de 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); 

Y el punto apiRoutes mi función de carga contienen simple impresión req param.using postman que funciona bien

 console.log("mediaChat called", req.body, req.files); 

respuesta

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

Aquí está mi código del cliente del androide (nota este código que trabaja el archivo con php $ _FILE pero no que trabaja con expreso)

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

Usando android este espectáculo con cable de respuesta como a continuación


 MediaChat llamado {null: '\ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ \ N \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ U002 \ u00a \ u003 \ u00a \ u00a \ u00a \ u00a \ u00a \ u00a \ u00a \ u001a \ u001a / cB8Bccccccccccc ....
   \ u001f. [   _  \ u0014) M   XIjX  7 ` =   /  8`  ïDʚ \ u0018 D    #  V # q ~ m q10L  ' }

I también intentó multer y otro multipart manejador pero notando trabajos. Por favor, ayúdame a salir de este infierno

Parece que la respuesta del servidor está codificada como UTF-8. Para decodificar y leer adecuadamente, puede intentar

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

Especificar la parte de codificación en el InputStreamReader decodificará y leerá el flujo utilizando el esquema de codificación especificado, que en este caso es UTF-8. Compruebe los javadocs para más detalles.

Necesitas asignar el búfer otra vez basado en el nuevo tamaño de bufferSize , he revisado el código abajo:

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

El envío múltiple de formularios suprime gran parte de la ambigüedad que tenía la codificación porcentual: el servidor ahora puede solicitar explícitamente ciertas codificaciones y el cliente puede indicar explícitamente al servidor durante la presentación del formulario qué codificación están en los campos.

Hay dos maneras de ir con esta funcionalidad: dejarlo sin configurar y hacer que el navegador envíe la misma codificación que la página, o configurarlo en UTF-8 y luego hacer otro servidor de conversión. Cada método tiene deficiencias, especialmente la primera.

Si le indica al navegador que envíe el formulario en la misma codificación que la página, todavía tiene el problema de qué hacer con caracteres que están fuera del rango de codificación de caracteres. El comportamiento, una vez más, varía: Firefox 2.0 los convierte en referencias de entidad de caracteres mientras que Internet Explorer 7.0 los mangles más allá de la inteligibilidad. Para propósitos serios de internacionalización, esto no es una opción.

La otra posibilidad es establecer Aceptar-Codificación a UTF-8, lo que plantea la pregunta: ¿Por qué no está utilizando UTF-8 para todo entonces? Esta ruta es más aceptable, pero hay una advertencia notable: sus datos entrarán como UTF-8, por lo que tendrá que convertirlo explícitamente en su codificación de caracteres locales favorecida.

Una codificación basada en Unicode como UTF-8 puede soportar muchos idiomas y puede acomodar páginas y formularios en cualquier mezcla de esos idiomas. Su uso también elimina la necesidad de que la lógica del servidor determine individualmente la codificación de caracteres para cada página servida o cada envío entrante de formularios. Esto reduce significativamente la complejidad de tratar con un sitio o aplicación multilingüe.

Una codificación Unicode también permite que se mezclen muchos más idiomas en una sola página que cualquier otra opción de codificación.

Vea por qué UTF-X

  • Uso de la memoria V8
  • Validación de token del backend para el inicio de sesión de Google+ en la aplicación de Android
  • Mensajería en la nube de Google (fake_message_id)
  • ¿Por qué usar TOTP / HOTP en lugar de simplemente usar math.random ()?
  • ¿Cómo enviar datos binarios con socket.io?
  • Dónde integrar la pasarela de pago PayU
  • Instalando PhoneGap, ejecutando el comando de error 'ant'
  • Visual Studio Córdova falla
  • Comunicarse con Android dispositivo bluetooth a través de NodeJS y Termux
  • Característica no implementada nodejs xmpp android
  • Enviar mensaje descendente a google ccs con nodo js
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.