2017-02-08 11 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

ねえ、私は参照してください。私のユースケースでは、ユーザーがプロフィール画像を変更した場合です。私がやろうとしているのは、現在の写真を上書きすることですが、同じキーを保つことです。そして、プロフィール画面に戻るたびに、私はそのS3リンクに行く必要があります。遅れは本当に悪いです。彼らのイメージが(バックエンドにあっても)変化していないことが分かるからです。その遅延を減らす方法はありませんか?今でも私はアプリを閉じてもう一度開くか、10分待ってもまだ古いプロファイルの画像があるので。 – TheQ

答えて

1

S3にアップロードされた正しいイメージがアプリケーションでは取得されていないため、このソリューションをGlideで試してみてください。

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

注: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など)。シグネチャが異なる場合、Glideは指定されたリソース(あなたのケースのURL)からイメージを取得し、シグネチャを更新します。通常は、画像を表示する必要があるたびに比較できるように、署名メタデータ(通常はlastUpdatedタイムスタンプが使用されます)をどこかに保存します(画像がユーザー画像の場合は、lastUpdatedImageタイムスタンプをUserテーブルに保存できます)。

関連する問題