2017-02-08 1 views
1

내 S3에 이미지가 있습니다. 안드로이드에서 S3의 동일한 키에 새 이미지를 업로드했습니다. s3에서 이미지가 올바르게 업데이트되었습니다. 그러나 이미지의 URL이있는 글라이드 라이브러리를 사용하여 업데이트 된 이미지를 안드로이드에서 가져 오면 마지막 이미지 파일이 생성되고 업데이트 된 이미지는 생성되지 않습니다. 이 문제를 해결하기 위해 S3에서 변경해야 할 설정이 무엇인지 잘 모릅니다! 누군가가 도울 수 있기를 바랍니다. 여기s3에서 업데이트 된 개체를 가져올 수 없습니까?

내가 S3에서 내 이미지를 얻을 방법입니다 : 내가 S3에 이미지를 업로드하는 방법

Glide.with(getBaseContext()).load("https://myBucketURL/" + username + "PROFILE_IMAGE").centerCrop().into(my_imageView); 

:

private void uploadToS3(String imagePath) 
    { 
     try 
     { 
      observer = transferUtility.upload(
        "myBucket",  /* The bucket to upload to*/ 
        username + "PROFILE_IMAGE", /* The key for the uploaded object*/ 
        imageStringToFile(imagePath,profileImageFile)  /* The file where the data to upload exists*/ 
      ); 
      observer.setTransferListener(new TransferListener() 
      { 
       @Override 
       public void onStateChanged(int id, TransferState state) { 
        // do something 
       } 
       @Override 
       public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { 
        int percentage = (int) (bytesCurrent/bytesTotal * 100); 
        //Display percentage transfered to user 
       } 
       @Override 
       public void onError(int id, Exception ex) { 
        // do something 
        Log.e(PROFILE_IMAGE,"error"); 
        Log.d(PROFILE_IMAGE, ex.getMessage()); 
       } 
      }); 
      success = true; 
      Log.d(PROFILE_IMAGE,"upload success!"); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
      Log.d(PROFILE_IMAGE,"upload failure"); 
      Log.d(PROFILE_IMAGE,e.getMessage()); 
      success = false; 
     } 
    } 

    private File imageStringToFile(String path, String fileName) throws IOException //returns you an image file FROM the image string 
    { 
     Bitmap bitmapImage = BitmapFactory.decodeFile(path); 
     //create a file to write bitmap data 
     File f = new File(activity.getBaseContext().getCacheDir(), fileName); 
     f.createNewFile(); 
     //Convert bitmap to byte array 
     byte[] bitmapdata = ImageCompression.getInstant().getCompressedBitmap(path).toByteArray(); 
     //write the bytes in file 
     FileOutputStream fos = new FileOutputStream(f); 
     fos.write(bitmapdata); 
     fos.flush(); 
     fos.close(); 
     return f; 
    } 

건배!

+1

이미지를 다시 가져올 때까지 기다리는 중입니까? 이 질문을보십시오 : http://stackoverflow.com/questions/23786609/what-is-maximum-amazon-s3-replication-time-on-file-upload –

+0

앞에 CloudFront와 같은 CDN이 있습니까? S3 버킷? –

+0

흠, 알겠습니다. 사용자가 프로필 사진을 변경하면 사용 사례에 따라 내가하려고하는 것은 현재 사진을 쓰는 것 이상이지만 같은 열쇠를 유지하는 것입니다. 그리고 그들이 프로필 화면으로 돌아올 때마다 나는 그 이미지가 변경되지 않았 음을 알기 때문에 지연이 정말 좋지 않을 것입니다 (심지어 백엔드에도 있음). 지연을 줄이는 방법이 없습니까? 왜냐하면 지금도 앱을 닫고 다시 열거 나 10 분 정도 기다렸다가 이전 프로필 이미지를 계속 유지하기 때문입니다. – TheQ

답변

1

S3에서는 업로드했지만 응용 프로그램에서는 올바른 이미지를 업로드하지 않으므로 글라이드를 사용하여 해결할 수 있습니다.

Glide.with(getBaseContext()) 
.load("https://myBucketURL/" + username + "PROFILE_IMAGE") 
.diskCacheStrategy(DiskCacheStrategy.NONE) 
.skipMemoryCache(true) 
.into(my_imageView); 

참고 : 다음 번에 표시 할 이미지의 캐시 된 버전을 사용하고있는 이미지 뷰의 글라이드에 이미지를로드하기 위해 동일한 URL을 유지하고 있기 때문에. 따라서 Glide에서 캐시를 제거하면 문제를 해결하는 데 도움이됩니다.

+0

예, 그것이 해결책이었습니다! 나는 그것을 다른 방식으로 구현 했으니 곧 공유 할 것이다. – TheQ

0

그래서 글라이드 라이브러리라는 것이 밝혀졌습니다. 새 파일을 업로드하기 전에 캐시를 덤프해야합니다.

  1. 처음 AsyncTask를를 사용하여 백그라운드 스레드를 시작하는 비동기 작업 2.In

을, 나는 캐시를 제거하는 removeGlideCache()를 호출합니다.

3. 그런 다음 가장 최근의 s3 객체를 onPostExecute()의 AsyncTask에 업로드합니다.

class RemoveGlideCacheAsyncTask extends AsyncTask<Void,Void,Void> 
    { 
     @Override 
     protected Void doInBackground(Void... params) 
     { 
      removeGlideCache(); 
      return null; 
     } 
     @Override 
     public void onPostExecute(Void var) 
     { 
      Glide.with(getBaseContext()).load("my_bucket_url/"+"imageKey").centerCrop().signature(new StringSignature(String.valueOf(System.currentTimeMillis()))).into(nD_image); 
     } 
    } 
    private void removeGlideCache() 
    { 
     Glide.get(Main.this).clearDiskCache(); 
    } 
0

모든 대답이 올바른 것입니다. 하지만 그들은 이미지를 보여주고 싶을 때마다 http 요청을하지 못하게하는 캐시의 목적을 무효화합니다. 서명 대신에 캐시 무효화를 사용하는 것이 좋습니다. 이 서명은 자원이 캐시 (예 : 귀하의 URL)에 있음을 확인하는 해시와 같으며, 서명이 다른 경우 글라이드는 지정된 자원 (이미지 케이스 URL)에서 지정된 이미지를 가져 와서 서명을 업데이트합니다. 일반적으로 서명 메타 데이터 (일반적으로 lastUpdated 타임 스탬프가 사용됨)를 어딘가에 저장합니다 (이미지가 사용자 이미지 인 경우 lastUpdatedImage 타임 스탬프를 User 테이블에 저장할 수 있으므로 이미지를 표시 할 때마다 비교할 수 있음).

관련 문제