从URL下载图像并将其保存到内部存储器的最佳方法

13

我正在开发一个应用程序,希望从URL下载图片。我需要一次性下载这些图像并将其存储到内部存储中。有200多张图片需要下载,请告诉我以最短的时间下载这些图片的最佳方法。如果有任何第三方库可用,请告诉我。


你可以使用Picasso或Volley。 - Ankit Bansal
Picasso不会将这些图像保存到内部存储中,它直接显示在UI上。 - Umesh Kumar Saraswat
1
你可以使用Volley库并创建一个自定义请求,在成功响应时直接将图像写入设备内存。 - Bubu
你可能想看一下我在stackoverflow上的这篇帖子https://dev59.com/bGUp5IYBdhLWcg3wEETd - Droidman
使用AQuery来实现此功能。它会将图片存储在内存缓存和本地存储中。请参考:https://code.google.com/p/android-query/wiki/ImageLoading - asad.qazi
你想一次性下载200张图片,还是想在ListView中实现图片的懒加载? - Paresh Mayani
4个回答

35

考虑使用Picasso来满足你的需求。我在我的项目中使用它。如果要将图像保存到外部磁盘上,可以使用以下代码:

 Picasso.with(mContext)
        .load(ImageUrl)
        .into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                try {
                    String root = Environment.getExternalStorageDirectory().toString();
                    File myDir = new File(root + "/yourDirectory");

                    if (!myDir.exists()) {
                        myDir.mkdirs();
                    }

                    String name = new Date().toString() + ".jpg";
                    myDir = new File(myDir, name);
                    FileOutputStream out = new FileOutputStream(myDir);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);

                    out.flush();
                    out.close();                        
                } catch(Exception e){
                    // some action
                }
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
            }
        }
    );

从这里您可以下载这个库。


1
我想下载200张图片。为此,我需要循环下载这些图片。 - Umesh Kumar Saraswat
1
@Signo:请查看Dhawal Shoda parmar在以下链接中的答案:https://dev59.com/_GUo5IYBdhLWcg3wmQVN#15918369 - uniruddh
1
@astuter非常感谢您的快速回复! :) 我尝试了但没有成功,它说如果ExternalStorage中没有任何内容,现在我会进行一些调试以找出问题所在,再次感谢 :) - LS_
1
谢谢!我是Android的新手,这非常有帮助。 - Seyyed
如果您需要同时下载多张图片,最好将名称创建为“String name = new Date().getTime() +“.jpg””。 - Sachin Varma
显示剩余2条评论

9
您可以从以下类似的URL下载图像:

您可以从以下类似的URL下载图像:

URL url = new URL("http://www.yahoo.com/image_to_read.jpg");
InputStream in = new BufferedInputStream(url.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while (-1!=(n=in.read(buf)))
{
   out.write(buf, 0, n);
}
out.close();
in.close();
byte[] response = out.toByteArray();

如果您想保存图像,可以执行以下操作:

FileOutputStream fos = new FileOutputStream("C://borrowed_image.jpg");
fos.write(response);
fos.close();

0
BitmapDrawable bitmapDrawable = (BitmapDrawable) holder.post_image.getDrawable();
                        Bitmap bitmap = bitmapDrawable.getBitmap();
                        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
                        MediaStore.Images.Media.insertImage(mContext.getContentResolver(), bitmap, "IMG_" + Calendar.getInstance().getTime(), null);

这是一个相当简单的任务...


0
 const actionDownloadImage = (urls) => {
        urls.map((url) => {
            const splitUrl = url.split("/");
            const filename = splitUrl[splitUrl.length - 1];
            fetch(url)
                .then((response) => {
                    response.arrayBuffer().then(function (buffer) {
                        const url = window.URL.createObjectURL(new Blob([buffer]));
                        const link = document.createElement("a");
                        link.href = url;
                        link.setAttribute("download", filename); //or any other extension
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                    });
                })
                .catch((err) => {
                    console.log(err);
                });
        });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接