2012-07-18 3 views
5

Ich habe eine Anwendung, die Fotos über einen Web-Service hochlädt. In der Vergangenheit habe ich eine Datei in einen Stream geladen und in Base64 konvertiert. Dann habe ich die resultierende Zeichenfolge über die write() -Methode eines OutputStreamWriter gepostet. Jetzt hat sich der Webservice geändert und erwartet mehrteilige/Formulardaten und es erwartet Base64 nicht.Android - Schreibe Byte-Array zu OutputStreamWriter

Also irgendwie muss ich die chararters dieser Datei wie ohne Konvertierung buchen. Ich bin mir sicher, dass ich in der Nähe bin, aber alles, was ich je bekomme, ist ein Unterlauf oder Überlauf der Inhaltslänge. Das Seltsame ist, dass ich im Debugger sehen kann, dass meine Pufferlänge die gleiche Länge hat wie der String, den ich poste. Hier ist, was ich tue und hoffentlich genug Code:

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

Gibt es einen Grund, warum Sie die Bytes in Zeichenfolgen konvertieren, anstatt sie in den Ausgabestrom roh zu schreiben? – Michael

+0

Da die write() - Methode von OutputStreamWriter char [] oder string akzeptiert. Nicht Byte []. – Paul

+1

Verwenden Sie stattdessen einen 'DataOutputStream'. –

Antwort

10

Änderung

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

mit diesem

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

und direkt anrufen dataStream.write(buffer);

lassen Sie mich wissen, wie es

verhalten

Bearbeiten: Bearbeitete Antwort nach Kommentar

+0

'conn' ist ein HttpURLConnection. getOutputStream() gibt keinen 'DataOutputStream' zurück, noch kann es gegossen werden. – Paul

+0

Tut mir leid. Brauche Kaffee. DataOutputStream dataStream = neuer DataOutputStream (conn.getOutputStream()); – Paul

+1

Seien Sie vorsichtig damit. Sie können zwar ein Byte [] in die Ausgabe schreiben, die anderen Methoden von DataOutputStream sind jedoch nicht mit OutputStremWriter kompatibel. Insbesondere kann OutputStreamWriter eine Standardcodierung für das Schreiben von Strings erhalten, wobei DataOutputStream über eigene proprietäre Codierungen verfügt. – davenpcj