改造-使用url下载文件作为响应

时间:2018-09-06 13:26:44

标签: android retrofit retrofit2 okhttp3 okhttp

This is my JSON Response from server

这清楚地表明,在获得响应之后,媒体文件url被接收到客户端。 我的问题是我如何使用直到获得响应后才能访问的URL下载文件? 并且有可能在获取URL的同时下载文件,或者接收URL然后下载文件吗?

我被困在这里,谁能在这里向我简要解释解决方案?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您需要在模型中解析Json。

然后,您可以获取url属性并将其下载到文件系统。您可以使用HttpUrlConnection来执行此操作,或者如果您想将Picasso库与Target Picasso一起使用并下载到文件系统中。

让我给你看一个例子。

使用毕加索

        public static void downloadImageWithPicasso(Context context, String url) {
            Picasso.with(context)
                    .load(your_url_from_model)
                    .into(saveUsingTarget(url));
        }

        private static Target saveUsingTarget(final String url){
            Target target = new Target(){

                @Override
                public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
                    new Thread(new Runnable() {

                        @Override
                        public void run() {

                            File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + url);
                            try {
                                file.createNewFile();
                                FileOutputStream ostream = new FileOutputStream(file);
                                bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
                                ostream.flush();
                                ostream.close();
                            } catch (IOException e) {
                                Log.e("IOException", e.getLocalizedMessage());
                            }
                        }
                    }).start();

                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {

                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {

                }
            };
            return target;
        }

使用 HttpUrlConnection

public void downloadImageWithUrlConnection(){
        try{

            URL url = new URL("your_url_from_model");

            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoOutput(true);
            urlConnection.connect();

            File sdCardPath = Environment.getExternalStorageDirectory().getAbsoluteFile();

            String filename = "file_name.png";


            File file = new File(sdCardPath,filename);
            file.createNewFile();

            FileOutputStream fileOutput = new FileOutputStream(file);
            InputStream inputStream = urlConnection.getInputStream();

            byte[] buffer = new byte[1024];
            int bufferLength = 0;

            while ( (bufferLength = inputStream.read(buffer)) > 0 ){
                fileOutput.write(buffer, 0, bufferLength);

            }

            fileOutput.close();

        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

重要:如果要使用HttpURLConnection选项,则需要在后台线程中运行它。

希望对您有帮助。