2012-07-18 10 views
5

Tengo una aplicación que carga fotos a través de un servicio web. En el pasado, cargué un archivo en una secuencia y lo convertí a Base64. Luego publiqué la cadena resultante mediante el método write() de un OutputStreamWriter. Ahora, el servicio web ha cambiado, y espera multipart/form-data y no espera Base64.Android - Escribir matriz de bytes en OutputStreamWriter

De alguna manera tengo que publicar los chararters de este archivo sin conversión. Estoy seguro de que estoy cerca, pero todo lo que obtengo es un contenido insuficiente o desbordado. Lo curioso es que en el depurador puedo ver que la longitud de mi buffer es de la misma longitud que la cadena que estoy publicando. Esto es lo que estoy haciendo y suficiente código de esperar:

// conn is my connection 
OutputStreamWriter dataStream = new OutputStreamWriter(conn.getOutputStream()); 

// c is my file 
int bytesRead = 0; 
long bytesAvailable = c.length(); 

while (bytesAvailable > 0) { 
    byte[] buffer = new byte[Math.min(12288, (int)bytesAvailable)]; 
    bytesRead = fileInputStream.read(buffer, 0, Math.min(12288, (int)bytesAvailable)); 

    // assign the string if needed. 
    if (bytesRead > 0) { 
     bytesAvailable = fileInputStream.available(); 

     // I've tried many encoding types here. 
     String sTmp = new String(buffer, "ISO-8859-1"); 
     // HERE'S the issue. I can't just write the buffer, 
     dataStream.write(sTmp); 
     dataStream.flush(); 
// Yes there's more code, but this should be enough to show why I don't know what I'm doing! 
+0

¿Hay alguna razón por la que convierta los bytes en cadenas en lugar de escribirlas sin formato en la secuencia de salida? – Michael

+0

Porque el método write() de OutputStreamWriter acepta char [] o cadena. No byte []. – Paul

+1

Intenta usar un 'DataOutputStream' en su lugar. –

Respuesta

10

cambio

OutputStreamWriter dataStream = new OutputStreamWriter(conn.getOutputStream()); 

con este

DataOutputStream dataStream = new DataOutputStream(conn.getOutputStream()); 

y directamente llaman dataStream.write(buffer);

que me haga saber cómo se comportan

Editar: respuesta editada de acuerdo con el comentario

+0

'conn' es una HttpURLConnection. getOutputStream() no devuelve un 'DataOutputStream', ni se puede convertir. – Paul

+0

Ugh, lo siento. Necesito café. DataOutputStream dataStream = new DataOutputStream (conn.getOutputStream()); – Paul

+1

Tenga cuidado con esto. Aunque le permitirá escribir un byte [] en la salida, los otros métodos de DataOutputStream no son compatibles con OutputStremWriter. En particular, OutputStreamWriter puede recibir una codificación estándar para escribir cadenas, donde DataOutputStream tiene sus propias codificaciones propietarias. – davenpcj

Cuestiones relacionadas