2013-08-07 8 views
3

Я пытаюсь использовать следующий код для загрузки файла в rest api. Этот код отлично подходит для файлов размером до 20 МБ, но большие файлы будут давать OutOfMemoryError. Я пытаюсь передать запрос и использовать запрос с множественной формой, так что мне не нужно хранить весь файл в памяти, но, может быть, куски слишком большие? Любая помощь приветствуется.Загрузка файла Android Spring OutofMemory

final File file = new File(filePath); 
    HttpHeaders header = new HttpHeaders(); 
    header.add("x-haiku-auth", HaikuAPI.getAuthHeader()); 
    header.setContentType(MediaType.MULTIPART_FORM_DATA); 
    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(
      "https://" + HaikuAPI.getDomain() + "/api/assignments") 
      .pathSegment(assignmentID + "", "submit"); 

    URI url = builder.build().toUri(); 

    MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>(); 

    parts.add("message[subject]", "Assignment Completed"); 
    parts.add("message[body]", message); 
    parts.add("message[assignment_id]", assignmentID + ""); 
    Uri uri = Uri.fromFile(file); 
    InputStreamResource res = new InputStreamResource(context.getContentResolver().openInputStream(uri)) { 
     @Override 
     public String getFilename() throws IllegalStateException { 
      return file.getName(); 
     } 

     @Override 
     public long contentLength() throws IOException { 
      return file.length(); 
     } 
    }; 
    parts.add("files[][file]", res); 
    parts.add("files[][filename]", file.getName()); 
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); 
    factory.setChunkSize(1024); 
    RestTemplate restTemplate = new RestTemplate(factory); 
    restTemplate.getMessageConverters().add(new FormHttpMessageConverter()); 
    HttpEntity<Object> request = new HttpEntity<Object>(parts, header); 
    restTemplate.postForLocation(url, request); 
    Log.e("f", "finished"); 
    return null; 

Ошибка: dalvikvm-heap: Out of memory on a 67102090-byte allocation.

+0

http://stackoverflow.com/questions/9630430/upload-large-file-in-android-with-outofmemory-error – KOTIOS

+0

@ Stacks28 Можно ли использовать Spring вместо HTTPURLConnection? –

+0

i hvnt работал с весенним приятелем, поэтому не мог предложить вам – KOTIOS

ответ

4

Анализируя код, кажется, Spring для Android буферов своих данных перед отправкой его - вот почему ваш УНО. Однако есть трюк (но пока я позволил работать только для уровня API 9 выше): вы можете отключить буферизацию для своего фабрики соединений, но ТОЛЬКО, если в RestTemplate нет набора (теперь, насколько глупо это ?) - вам повезло, так как вы его не задали. Поэтому в вашем случае ситуация очень проста, просто позвоните по номеру factory.setBufferRequestBody(false); после того, как вы ее создали.

+0

Большое вам спасибо! –

+0

@ gunar, вы спасли день. я твой должник – francis

Смежные вопросы