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
- Cordova android build falla inmediatamente
- Conexión de socket - Java añade bytes
- No hay certificado de pares Excepción - Volley y Android con certificado auto-firmado
- ¿No puede ejecutar node.js en el teléfono Android?
- Cordova Android Upgrade - No se puede encontrar el módulo 'lodash / object / assign' Error
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
- La conexión WebRTC falla en los datos celulares
- No se pudo iniciar './qemu/windows-x86_64/qemu-system-i386.exe': No existe ningún archivo o directorio de este tipo
- Watchman: error al cargar bibliotecas compartidas: libpcre.so.1
- Cordova - Código de error 1 para comando | Error de comando para
- Error: Error de gancho con el código de error 1:
- Enviar JSONObject desde la aplicación android a node.js sobre http?
- Node.js Hmac SHA256 base64 de cadena
- ¿Dos servidores node.js?
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