Android - Как скачать изображения с s3?

Я читаю руководство s3 для Android, и я действительно смущен тем, как загружать мои файлы.

Они предоставляют этот код:

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.

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

ура!

+1
источник поделиться
2 ответа

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

Вам не нужно публиковать ведро. Вы можете напрямую показать изображение через 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);
}
}
+4
источник

Так что я могу использовать Glide или picasso для загрузки изображения, используя url -адрес изображения в корзине s3. Но вы должны сделать ведро публичным.

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

     Glide.with(getActivity().getBaseContext()).load("IMAGE URL FROM S3").centerCrop().into(cardImage);
    

И благодаря @KNeerajLal вот как вы можете сделать ваше ведро публичным. Вот:

обнародование ведра

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос