2017-02-02 3 views
1

Я читаю руководство android s3 s и im действительно путают, как загрузить мои файлы.Android - Как скачать изображения с s3?

Они обеспечивают этот код:

TransferObserver observer = transferUtility.download(
    MY_BUCKET,  /* The bucket to download from */ 
    OBJECT_KEY, /* The key for the object to download */ 
    MY_FILE  /* The file to download the object to */ 
); 

Так что такое my_file? я предполагаю, чтобы создать локальный пустой файловый объект и передать его в эту функцию загрузки transferUtility, и он заполняет этот пустой файл одной загрузкой?

И, когда я закончу получение файла (в частности, для изображений), как загрузить этот файл в imageView с помощью скольжения или Picasso?

Я не уверен, как использовать объект TransferObserver.

Надеюсь, что кто-то может предоставить рабочий пример, пожалуйста!

ура!

+0

У вас есть ссылка на изображение? –

+0

Да, у меня есть URL-адрес изображения, и я попробовал это, но пикассо и скольжение не загрузили его. – TheQ

+0

Есть ли ошибки? –

ответ

1

Поэтому я могу использовать Glide или picasso для загрузки изображения с помощью URL-адреса изображения в ведро s3. Но вы должны сделать ведро открытым.

  1. Вот как вы загрузите изображение:...

    Glide.with (. GetActivity() getBaseContext()) нагрузки ("IMAGE URL FROM S3") centerCrop() в (cardImage) ;

И благодаря @KNeerajLal вот как вы можете сделать свое ведро открытым. здесь:

making bucket public

3

Хотя я довольно поздно, в ответ на этот вопрос. Надеюсь, это поможет кому-то, кто застрял в этой проблеме.

Вам не нужно публиковать ведро. Вы можете напрямую показать изображение через Glide. Здесь мое репо загружает изображение из ковша amazon s3 через Glide.

https://github.com/jontyankit/Glide-Amazon-Image-Load

Вы должны переопределить GlideModule и зарегистрировать наш компонент

public class CustomGlideModule implements GlideModule { 

@Override 
public void applyOptions(Context context, GlideBuilder builder) { 
    builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); 
} 

@Override 
public void registerComponents(Context context, Glide glide) { 
    glide.register(ImageModel.class, InputStream.class, new ImageLoader.Factory()); 
} 
} 

Сделать заказ ModelLoader класс. Этот класс получает изображение на основе модели, описанной выше, вместо URL

public class ImageLoader implements ModelLoader<ImageModel, InputStream> { 

private final ModelCache<ImageModel, ImageModel> mModelCache; 

public ImageLoader(ModelCache<ImageModel, ImageModel> mModelCache) { 
    this.mModelCache = mModelCache; 
} 

@Override 
public DataFetcher<InputStream> getResourceFetcher(ImageModel model, int width, int height) { 
    ImageModel imageModel = model; 
    if (mModelCache != null) { 
     imageModel = mModelCache.get(model, 0, 0); 
     if (imageModel == null) { 
      mModelCache.put(model, 0, 0, model); 
      imageModel = model; 
     } 
    } 
    return new ImageFetcher(imageModel); 
} 

public static class Factory implements ModelLoaderFactory<ImageModel, InputStream> { 

    private final ModelCache<ImageModel, ImageModel> mModelCache = new ModelCache<>(500); 

    @Override 
    public ModelLoader<ImageModel, InputStream> build(Context context, GenericLoaderFactory factories) { 
     return new ImageLoader(mModelCache); 
    } 

    @Override 
    public void teardown() { 

    } 
} 

} 

И наконец сделать пользовательский класс DataFetcher. public InputStream loadData (приоритет приоритета) - это метод, который будет загружать изображение из Amazon.

public class ImageFetcher implements DataFetcher<InputStream> { 

private final ImageModel imageModel; 
private InputStream mInputStream; 
boolean downloadComplete = false; 
int transferId = 0; 

public ImageFetcher(ImageModel imageModel) { 
    this.imageModel = imageModel; 
} 

@Override 
public InputStream loadData(Priority priority) throws Exception { 
    return fetchStream(imageModel); 
} 

private InputStream fetchStream(final ImageModel imageModel) { 
    TransferUtility transferUtility = AmazonClient.getClient().getTransferUtility(); 
    TransferObserver bolomessages = transferUtility.download(imageModel.getBucketName(), imageModel.getId(), new File(imageModel.getLocalPath())); 
    transferId = bolomessages.getId(); 

    bolomessages.setTransferListener(new TransferListener() { 

     @Override 
     public void onStateChanged(int id, TransferState state) { 
      Log.wtf("AWSS3", "onStateChanged = " + state); 
      if (state == TransferState.COMPLETED) { 
       File initialFile = new File(imageModel.getLocalPath()); 
       try { 
        mInputStream = new FileInputStream(initialFile); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
       downloadComplete = true; 
      } 
     } 

     @Override 
     public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { 
     } 

     @Override 
     public void onError(int id, Exception ex) { 
      // do something 
      Log.wtf("AWSS3", "onError"); 
      ex.printStackTrace(); 
      downloadComplete = true; 
     } 
    }); 
    while (!downloadComplete){} 
    return mInputStream; 
} 

@Override 
public void cleanup() { 
    if (mInputStream != null) { 
     try { 
      mInputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      mInputStream = null; 
     } 
    } 
} 

@Override 
public String getId() { 
    return imageModel.getId(); 
} 

@Override 
public void cancel() { 
    AmazonClient.getClient().getTransferUtility().cancel(transferId); 
} 
} 

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

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