2017-02-08 11 views
1

поэтому у меня есть изображения в моем S3. В android я загрузил новое изображение на тот же ключ в S3. В s3 изображение правильно обновилось. Но, когда я вытаскиваю это обновленное изображение из android, используя библиотеку Glide с URL-адресом изображения, я получаю последний файл изображения, а не обновленный. Я понятия не имею, какую настройку я должен изменить на S3, чтобы исправить это! Я надеюсь, что кто-то может помочь!не может получить обновленный объект в s3?

Вот как я получаю мои изображения с s3:

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

Как я загружать изображения в s3:

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

У вас есть CDN, например CloudFront перед ведро 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); 

Примечание: Поскольку вы оставляете же Url, чтобы загрузить изображение в ImageView Glide использует кэшированную версию изображения для отображения в следующий раз. Таким образом, удаление кеша в Glide может помочь решить вашу проблему.

+0

Да, это было решение! Я реализовал его другим способом, который я скоро поделюсь. – TheQ

0

Итак, проблема оказалась в том, что это была библиотека скольжения. Прежде чем загружать новую, вы должны сбросить свой кеш.

  1. я первый запустить фоновый поток с помощью AsyncTask:

2 этой асинхронной задачи, я называю 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-адрес для вашего случая), указанный и обновляет подпись. Обычно вы сохраняете метаданные подписи (обычно используется последняя временная метка времени) (если ваше изображение является образ пользователя, тогда вы можете сохранить временную метку lastUpdatedImage в таблице User), чтобы вы могли сравнивать каждый раз, когда вам нужно показать изображение.

 Смежные вопросы

  • Нет связанных вопросов^_^