2011-07-07 2 views
7

다른 데이터 (첨부 파일이있는 이메일과 매우 유사)와 함께 이미지를 서버에 가져와야합니다. 나는 또한 그것을 재 시도 할 수있는 신뢰할 수있는 방식으로해야한다. 실패 등.안드로이드가 가장 효율적인 방법으로 서버에 그림 업로드

서버는 WCF REST 서버이며 다른 통신 (JSON)을 많이 사용하지만 이미지를 업로드하기위한 새로운 요구 사항이 있습니다.

저는 JSON을 사용하여 내 서버에 데이터를 게시하므로 안드로이드 측의 GSON을 사용하여 데이터를 직렬화합니다. 여기

내가 그것을 (다른 모든이 방식으로 작동하지만, 난 그냥 이미지로 시작)

  1. 사용자 작성 활동 필드 (텍스트 데이터)
  2. 사용자가 일부 사진 (들)을 취 지금까지 구현 가지고 어떻게 카메라 의도를 통해. 현재 나는 그림 1 파일을 사용하고 있습니다.
  3. SDCard에서 그림을 가져 와서 크기를 조정하십시오. ImageView를보고 바이트로 저장하십시오.
  4. 사용자 제출 - 바이트 []의 이미지와 함께 모든 데이터를 가져 와서 넣습니다. 자바로는
  5. 전화 GSON 컨버터를 반대하고 SQLite는
  6. AsyncTask를 레코드에 대한 SQLite는 찾습니다
  7. 에 객체를
  8. 저장 객체를 직렬화의 커서를 열고 얻을 텍스트는
  9. AsyncTask를 내 서버에 HttpConnection에 게시합니다 텍스트 데이터를 생성한다.
  10. 되는 최종 내 문제에 대한 지금

.. 분명히 # 3 - 내 바이트 배열에 나는 "폭발"램. 때로는 넥서스 S가 부진하다고 느낄 때도 있습니다. 하지만 그렇게함으로써 - SD 카드 나 앱 폴더에 많은 파일을 채우지 않아도됩니다. 나는 사진을 찍고 그것을 잡는 것보다. 다음 사진이 이전 사진을 덮어 씁니다.

단계 5는 느립니다. 나는 GSON에서 사용자 정의 시리얼 라이저를 시도하지 않고 [1, -100,123, -12]와 같은 것으로 바이트 배열을 직렬화하는 대신 Base64로 훨씬 작은 크기를 얻을 수 있지만 그래도 여전히 사용할 수 있습니다. 느려질 것입니다. 그리고 최대 20 개의 이미지를 가질 수 있습니다 ...

# 6 단계는 아무런 문제가되지 않습니다. 그러나 특정 크기로이 모든 일이 내가 좋아하는 무언가가 아니다, 나는 그래서

07-06 20:28:47.113: ERROR/CursorWindow(16292): need to grow: mSize = 1048576, size = 925630, freeSpace() = 402958, numRows = 2 
07-06 20:28:47.113: ERROR/CursorWindow(16292): not growing since there are already 2 row(s), max size 1048576 
07-06 20:28:47.113: ERROR/Cursor(16292): Failed allocating 925630 bytes for text/blob at 1,1 

OpenCursor

에 7 단계에서 오류가 발생하기 시작했다 (I는 300 픽셀 이미지를 시도했다). 이상적으로 모든 데이터를 서버에 단일 피스로 업로드하고 싶습니다.

나는 이미지를 SD 카드에 저장하고 이름 만 DB에 저장한다고 생각했다. 서버에 보내기 전에 바로 처리 할 것입니다. 그리고 성공하면 그 이미지들을 삭제할 것입니다. 이런 종류의 로직은 SQLite 스키마를 훨씬 더 복잡하게 만들지 만 더 좋은 방법은 없을 것입니다!

이미지 처리에있어 최선의 방법을 찾고 있습니다.최소 메모리/CPU 사용량에 따라와 수행 방법 : 현재

:

  1. 테이크 사진
  2. 썸네일 표시
  3. 크기 조정
  4. 은 EDIT 1

서버에게 보내기 나는 여러 부분 MIME 메시지로 전체 shizang을 업로드 할 가능성을 연구 중이다. JAR 파일을 Android 패키지에 추가해야합니다. 또한 아파치 코드는 이미지를로드하는 것입니다 얼마나 효과적 모르겠어요 그들을 전송 http://okandroidletsgo.wordpress.com/2011/05/30/android-to-wcf-streaming-multi-part-binary-images/

을 (난 내 코드보다 더 나은 것 같아요) 그리고 더이 때문에 나는 WCF 측이 모든 분석을 처리 할 필요가 없습니다 것 내장 된 .NET 프레임 워크로이를 수행하는 방법.

http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html

당신이 노력해도 알려주세요!

편집 2 :

MIME은 좋지 않습니다. 이 같은 일이 Base64로를 사용하여 바이너리 직렬화하기 때문에 아무 소용이

+1

그래서 그림을 데이터베이스에 저장하고 있습니까? 데이터베이스 크기가 폭발적으로 늘어나 사용자가 앱이 전화 내부 저장소에 너무 많은 공간을 차지하고 app2sd 지원을 요청할 것이라고 불평 할 것입니다. 왜 SD 카드에 이미지를 보관하지 않을까요? –

+0

@denis 안드로이드 1MB에서 커서 크기 제한을 발견했기 때문에 내부 저장 장치에 문제가있는 것뿐만 아니라 SQLite에서 이러한 종류의 데이터를 저장하면 쉽게 제한을 초과합니다. 외장형 스토리지를 사용하는 것만으로 이러한 물건을 다루는 올바른 방법 일 것입니다. – katit

답변

16

아무도 대답하지하지만 여기에 내가 어려운 방법을 생각 것입니다 ..이 없다 :

규칙 # 1 : 이미지를 다룰 때 - 개체/메모리를 사용하지 마십시오. 분명히 들리지만 그렇지 않습니다. 이미지 크기를 800x600으로 조정하면 문제가 없다고 생각했습니다. 더 큰 것 - 더 큰 파일에서 HTTP 스트림을 수행 할 수 있기 때문에 그냥 그대로 둘 수 있습니다. 처리를 위해 이미지를 메모리에로드 할 때 OOM 예외로 작업하기가 어렵습니다.

규칙 # 2 : GSON - JsonWriter를 사용하여 스트림을 채 웁니다. 그렇지 않으면 메모리가 폭발 할 것입니다. 스트림을 HttpClient에 전달하는 것보다. JsonWriter는 청크로 쓰고 처리되는대로 데이터가 전송됩니다.

규칙 # 3 : 규칙 # 2를 참조하십시오. 여러 개의 작은 이미지에 대해서는 정상적으로 작동합니다. 이렇게하면 GSON이 하나씩 직렬화하여 스트림으로 피드합니다. 각 이미지는 메모리에로드됩니다.

규칙 # 4 : 이것은 아마도 최상의 솔루션이지만 서버와의 조정이 더 필요합니다. 서버로 메시지를 보내기 전에 이미지가 1 씩 전송되었습니다. 그들은 인코딩없이 스트림으로 보냈습니다. 이렇게하면 base64로 인코딩 할 필요가 없으며 장치의 메모리에로드 할 필요가 없습니다. 전송 크기도 작아집니다. 모든 이미지가 전송되면 주 정보 객체가 게시되고 모든 패키지가 서버에 수집됩니다.

규칙 # 5 :

  • 어떤 크기 조정없이 이미지를 전송하는 자원의 용어에서 훨씬 저렴 : SQLite는

    결론에 BLOB를 저장 잊어 버려요. 이미지 크기가 약 800x600-ish 인 경우에만 크기 조정이 가능합니다.

  • 단일 패키지에서 여러 이미지를 전송하면 이미지가 600x400-ish와 같이 작아지면 의미가 있습니다.
  • 파일을 업로드해야하는 즉시 모든 곳에서 사고 스트림을 시작하십시오. 메모리에 내용을로드하지 마십시오.
+0

안녕하세요, Katit, 감사합니다. 기기와 서버 측에 대한 스 니펫이 있습니까? 이미지를 서버에 업로드하고 싶습니다. 지금 PHP를 사용하고 있습니다. – Diego

관련 문제