J'ai une application Android qui tente de télécharger des photos sur un serveur Web via l'interface API. La méthode fonctionne très bien tant que les tailles d'image ne sont pas trop grandes (échoue quelque part autour de 1280x800) Heres le code qui fonctionnera sera plus petites images mais échoue avec les plus grandes. Aucune suggestion?Comment puis-je corriger mon téléchargement de photos Android pour envoyer des flux de données plus importants
public void uploadPhoto(FileInputStream fileInputStream, String session_key) throws IOException, ClientProtocolException {
URL connectURL = new URL(API_ENDPOINT_URL + "session_key="
+ session_key + "&method=" + ApiMethods.UPLOAD_PHOTO);
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+ boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
// Log.d(TAG, " dos1: " + dos);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ "file.png" + "\"" + lineEnd);
// Log.d(TAG, " dos2: " + dos);
dos.writeBytes(lineEnd);
// Log.d(TAG, " dos3: " + dos);
// create a buffer of maximum size
int bytesAvailable = fileInputStream.available();
int maxBufferSize = 1024;
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
// read file and write it into form...
int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
Log.d(TAG, " BytesREad:" + bytesRead);
while (bytesRead > 0) {
Log.d(TAG, " BytesREad in while:" + bytesRead);
dos.write(buffer, 0, bufferSize);
// Log.d(TAG, " dos3: " + dos);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
/*
* dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary +
* twoHyphens + lineEnd);
*/
}
// send multipart form data necesssary after file data...
// dos.write(data);
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Log.d(TAG, " dos4 tostring: " + dos.toString());
// close streams
// Log.e(Tag,"File is written");
// fileInputStream.close();
dos.flush();
// Log.d(TAG, " dos5: " + dos.toString());
InputStream is = conn.getInputStream();
// retrieve the response from server
int ch;
StringBuffer b = new StringBuffer();
while ((ch = is.read()) != -1) {
b.append((char) ch);
// Log.d(TAG, " b: " + b.toString());
}
String s = b.toString();
Log.i("Response", s);
// Log.d(TAG, " response:" + s);
dos.close();
}
Les erreurs comprennent
10 à 20 avril: 16: 26,658: ERREUR/dalvikvm tas (20213): allocation externe 8957952 octets trop grand pour ce processus. 10-20 04: 16: 26.658: ERROR/dalvikvm (20213): mémoire insuffisante: taille de tas = 4551 Ko, alloué = 3039 Ko, taille de bitmap = 9496 Ko 10-20 04: 16: 26.658: erreur/(20213): VM ne nous laissera pas allouer 8957952 octets
Je suis confronté aussi même prob avec l'un de mon code. – viv