2011-04-08 4 views
1

iPhone에서 Google의 백엔드 (클라우드) 서비스로 이미지를 업로드하는 데 문제가 있습니다. 이 호출은 간단한 HTTP 파일 업로드이며, 업로드가 완료되기 전에 연결이 끊어지는 문제가 발생합니다. 서버 측에서 IOError : Client read error (Timeout?) 오류가 발생합니다.iPhone : 전화에서 서버로 대용량 파일을 업로드하기위한 전략

이 경우는 산발적으로 발생합니다. 대부분의 경우 작동하며 때로는 실패합니다. 연결 상태가 좋으면 (예 : Wi-Fi) 항상 작동합니다.

우리는 클라이언트 라이브러리에서 다양한 타임 아웃 매개 변수를 조정하여 어떤 것도 치지 않도록했습니다. 문제는 실제로 신뢰할 수없는 모바일 연결로 보입니다.

필자는 연결 상태가 좋지 않아도 업로드를 신뢰할 수 있도록하기위한 전략을 생각하고 있습니다.

가장 먼저 생각한 것은 파일을 작은 조각으로 나누어 조각으로 옮겨서 조각을 전송하여 각 조각이 그려지는 가능성을 높이는 것입니다. 그러나 이는 클라이언트와 서버 측 모두에서 상당한 복잡성을 초래합니다.

더 깨끗한 접근 방법이 있습니까? 너는 어떻게 이걸 처리 하겠니?

+0

얼마나 큰 이야기입니까? 5 메그? 20 메가? –

+0

5MP 카메라이며 사진은 1 ~ 3MB 정도입니다. – Parand

답변

0

네, 시간 초과는 일반적으로 까다 롭고 모바일 연결을 처리 할 때 더 복잡해집니다.

여기에 몇 가지 아이디어입니다 : 당신이하고있는 것처럼

  1. 시도가 클라우드 서비스에 업로드 할 수 있습니다. 몇 가지 실패 (시간 초과) 후 파일을 표시하고 사용자에게 Wi-Fi 네트워크에 전화기를 연결하라고 요청하거나 컴퓨터에 연결될 때까지 기다렸다가 웹을 통해 수동으로 업로드하도록 기다립니다. 그러나 이는 사용자에게 더 많은 작업을 요구하기 때문에 이상적이지 않습니다. 위쪽은 구현 방식으로, 아주 간단합니다.

  2. 대신 HTTP 업로드를 수행하는 대신 원시 소켓 전송을 수행하십시오. 원시 소켓을 사용하면 바이너리 데이터를 아주 쉽게 보낼 수 있으며 모든 청크 전송 시간이 초과되면 전체 이미지 파일이 전송 될 때까지 다시 보내십시오. 이것은 바이너리 소켓 전송을 관리해야하기 때문에 "더 복잡합니다"하지만 HTTP 업로드를 통해 파일을 청크하는 것보다 쉽습니다.

어쨌든 그렇게 접근합니다.

+0

감사합니다. 앨런. 우리는 이미 1을하고 있지만 가능하다면 non-wifi를 신뢰할 수있게 만들고 싶습니다. 2의 경우 원시 소켓 경로를 간다면 http 이외의 서버 부분을 처리해야합니다. 방화벽, 역방향 프록시 등을 통해 모든 종류의 흥미로운 주름이 생깁니다. http 덩어리를 사용하면 최소한 대부분을 사용할 수 있습니다 기존 인프라 스트럭처를 그대로 유지합니다. – Parand

1

ASIHTTPRequest 라이브러리를 사용합니다. 대역폭 조절과 같은 몇 가지 훌륭한 기능이 있습니다. 먼저 파일을 메모리에로드하는 대신 시스템에서 직접 파일을 업로드 할 수 있습니다. 또한 나는 사진을 10 부분으로 분해 할 것이다. 그래서 5 메가 사진의 경우, 그것은 각각 500k와 같을 것입니다. 업로드 할 때마다 using a queue을 작성하면됩니다. 그런 다음 앱이 백그라운드로 들어가면 현재 업로드중인 부분을 완료 할 수 있습니다. 할당 된 시간에 모든 부품 업로드를 완료 할 수없는 경우 사용자에게 완료되지 않았 음을 알리는 로컬 알림을 게시하십시오. 그런 다음 모든 부품이 서버로 전송 된 후 모든 부품을 다시 서버 측의 사진으로 결합하는 최종 요청을합니다.

+1

+1 for ASIHTTPRequest - 멋진 라이브러리. – Moshe

+0

우리는 ASIHTTPRequest를 사용하고 있습니다. 핵심 이슈가 AT & T의 네트워크와 관련이있는 것으로 보입니다. 이제 해결 방법을 테스트하고 있습니다 (http://groups.google.com/group/asihttprequest/browse_thread/thread/c5805a53a04eb2e8 참조). – Parand

관련 문제