2012-03-12 2 views
3

Я очень много нового в разработке Android, и я пытаюсь загрузить файл размером от 25 до 50 МБ на веб-сервер, и я получаю ошибку из памяти. Я боюсь последние 2 дня и понятия не имею, где я ошибаюсь.Android Загрузка больших файлов

Есть предложения по поводу того, куда я иду не так?

Код я работаю на это

private FileInputStream fileInputStream = null; 
private int bytesavailable,buffersize,bytesRead ; 
byte buff[]; 
int maxBufferSize = 1*1024*1024; 
String server_url ="server_url"; 
DataOutputStream dos; 
String Builder response = new String Builder(); 
String body = "boundary values"; 
String body2 = "Boundary values"; 
URL url = null; 
    try 
    { 
     url = new URL(server_url); 
    } 
    catch (MalformedURLException e1) 
    { 
     e1.printStackTrace(); 
    } 

    HttpURLConnection conn = null; 
    try 
    { 
     conn = (HttpURLConnection) url.openConnection(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    try 
    { 
     conn.setRequestMethod("POST"); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setRequestProperty("Connection","Keep-Alive"); 
     conn.setRequestProperty("Content-Type","multipart/form-data; boundary=A300x"); 
     conn.connect(); 
     dos = new DataOutputStream(conn.getOutputStream()); 
     dos.writeBytes(body); 
     File inputfile = new File(sourceFile); 
     fileInputStream = new FileInputStream(inputfile); 


     bytesavailable = fileInputStream.available(); 
     buffersize = Math.min(bytesavailable, maxBufferSize); 
     buff = new byte[buffersize]; 
     bytesRead = fileInputStream.read(buff, 0, buffersize); 


      while (bytesRead > 0) 
      { 

       dos.write(buff, 0, buffersize); 
       dos.flush(); 
       bytesavailable = fileInputStream.available(); 
       buffersize = Math.min(bytesavailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buff, 0, buffersize); 
      } 
     fileInputStream.close(); 
     dos.write("\r\n".getBytes()); 
     dos.write(body2.getBytes()); 
     dos.flush(); 
     dos.close(); 
} 
    catch (ProtocolException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    int iresponse = 0; 
    try 
    { 
     iresponse = conn.getResponseCode(); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    //printStream(conn.getInputStream()); 

    if (iresponse == HttpURLConnection.HTTP_OK) 
    { 

     BufferedReader input = null; 
     try 
     { 
      input = new BufferedReader(new InputStreamReader(conn.getInputStream()), 8192); 
     } 
     catch (IOException e1) 
     { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     String line = null; 
     try 
     { 
      while ((line = input.readLine()) != null) 
       response.append(line); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try 
     { 
      input.close(); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    return response.toString(); 
+0

Не могли бы вы разместить трассировку стека? Похоже, что вы загружаете входной файл во время загрузки. – louielouie

ответ

0

Вы не можете загрузить весь файл в память - на многих устройствах, вы ограничены 16Мб или 32 Мб динамической памяти. Вы должны передать файл на сервер небольшими кусками.

+0

есть ли какой-нибудь пример программы, объясняющей, как блокировать данные? –

+1

http://stackoverflow.com/questions/9630430/upload-large-file-in-android-with-outofmemory-error - Проверить этот URL-адрес –

0

Это может быть полезно.

private void uploadFile(File file) throws IOException { 
    Log.i(TAG, "Uploading " + file); 
    String videoName = file.getParentFile().getName(); 

    AndroidHttpClient httpclient = AndroidHttpClient.newInstance(GoProLive.TAG); 
    try { 
     HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), ConnectTimeout); 
     HttpConnectionParams.setSoTimeout(httpclient.getParams(), DataTimeout); 
     HttpPost post = new HttpPost(
       String.format("http://" + ServerName + "/upload/%s/%s", user.getUsername(), file.getName())); 
     post.setEntity(new FileEntity(file, "application/octet-stream")); 

     SimpleDateFormat df = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT, Locale.US); 
     df.applyPattern("EEE, dd MMM yyyy HH:mm:ss z"); 
     post.setHeader("Last-Modified", df.format(new Date(file.lastModified()))); 
     HttpResponse httpResponse = executePost(httpclient, post); 
     int statusCode = httpResponse.getStatusLine().getStatusCode(); 
     if (statusCode == HttpStatus.SC_OK) { 
      file.delete(); 
     } else { 
      throw new HttpException("Failed to upload file " + file.getAbsolutePath(), statusCode); 
     } 
    } finally { 
     httpclient.close(); 
    } 
} 
Смежные вопросы