2014-05-21 2 views
1

이동 서버 측 코드에서 Blobstore의 이미지를 읽으려고합니다. 그러나 이미지가 크면 (0.5MB - 1.7MB에서와 같이) 바이트 버퍼의 대부분이 0이되어 이미지가 손상됩니다.Blobstore 판독기가 큰 이미지를 읽지 않습니다.

이 이미지는 serveUrl을 사용하면 작동하지만이 경우이 옵션이 아닙니다.

시스템 전체의 안전 할당량 외에도

는 한계가 Blob 저장소의 사용에 특별히 적용 : Blob 저장소의 최대 크기

내 첫번째 생각은 읽기에 크기 제한, found this이이었다이었다 이 하나의 API 호출로 응용 프로그램에서 읽을 수있는 데이터는 32 메가 바이트입니다.

내가 읽는 이미지는 32MB 근처에 없습니다. 나는 Blob 저장소에서 읽는 데 사용할

기능 :

func BlobAsBase64(c appengine.Context, blobKey string) (*blobstore.BlobInfo, string, error) { 
    info, err := blobstore.Stat(c, appengine.BlobKey(blobKey)) 
    if err != nil { 
     return nil, "", err 
    } 

    imageBuffer := make([]byte, info.Size) 
    reader := blobstore.NewReader(c, appengine.BlobKey(blobKey)) 
    if _, err = reader.Read(imageBuffer); err != nil { 
     return nil, "", err 
    } 

    imageBase64 := base64.StdEncoding.EncodeToString(imageBuffer) 

    return info, imageBase64, nil 
} 

나는 Blob 저장소에서 읽을 때 내 이미지가 깨진 될 이유는 무엇입니까?

답변

2

이것이 작동하지 않는 이유는 reader.Read 메서드가 버퍼를 채우기 전에 반환되기 때문이라고 추측합니다. io.Reader

읽기는 p로 len (p) 바이트까지 읽습니다. 바이트 수 (0 < = n < = len (p)) 및 발생한 오류 수를 반환합니다. Read 이 n < len (p)를 반환하더라도 호출 중에 모든 p를 스크래치 공간으로 사용할 수 있습니다. 일부 데이터는 사용할 수 있지만 len (p) 바이트는 사용할 수없는 경우 Read 은 일반적으로 더 이상 기다리지 않고 사용할 수있는 것을 반환합니다.

특히 마지막 문장에 유의하십시오.

reader.Read(imageBuffer) 대신 ioutil.ReadAll을 사용하면 문제를 해결할 수 있습니다.

+1

이것이 내 문제의 해결책이었습니다! 너 락! 고맙습니다! :) –