ResponseCode 400 用于从 url 下载图像

ResponseCode 400 for downloading image from url

这是我为从 url 下载图像而编写的代码,但使用 java.io.FilenotFoundException

收到响应代码 400
@Override
protected Void doInBackground(String... strings) {

    try {
        URL url = new URL(strings[0]);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestProperty("User-Agent", "Mozilla/5.0 
        (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) 
        Gecko/20100316 Firefox/3.6.2");
        con.setRequestMethod("GET");
        con.setDoOutput(true);
        con.connect();

        File file = Environment.getExternalStorageDirectory();
        File f1 = new File(file, "_Url download");
        if(!f1.exists()){
            f1.mkdir();
        }

        fileName = System.currentTimeMillis() + ".jpg";

        File f2 = new File(f1, fileName);
        f2.createNewFile();

        InputStream er = con.getErrorStream();
        Log.i("ErrorCode", con.getResponseCode()+"");
        Log.i("ErrorMessage", con.getResponseMessage());
        Log.i("ErrorStream", er+"");

        InputStream in = con.getInputStream();
        FileOutputStream out = new FileOutputStream(f2);

        byte[] buffer = new byte[1024];
        int len;

        System.out.println(Arrays.toString(buffer));

        while((len = in.read(buffer, 0, 1024)) > 0) {
            out.write(buffer, 0, len);
        }

        out.close();
        in.close();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        Log.i("IOException", e.toString());
    }
    return null;
} 

日志

2021-06-26 09:26:25.532 26760-26890/com.example.urldownload I/ErrorCode: 400

2021-06-26 09:26:25.533 26760-26890/com.example.urldownload I/ErrorMessage: Bad Request

2021-06-26 09:26:25.533 26760-26890/com.example.urldownload I/Errorstream: buffer(com.android.okhttp.internal.http.Http1xStream$FixedLengthSource@fbb2c70).inputStream()

2021-06-26 09:26:25.534 26760-26890/com.example.urldownload I/IOException: java.io.FileNotFoundException: https://instagram.fidr1-1.fna.fbcdn.net/v/t51.2885-15/e35/190664842_184685183538740_5039921250568173600_n.jpg?tp=1&_nc_ht=instagram.fidr1-1.fna.fbcdn.net&_nc_cat=108&_nc_ohc=RrEU4lTwYCwAX-vgVQ4&edm=AABBvjUBAAAA&ccb=7-4&oh=3ac34be54793fa59134380fd9e0bd617&oe=60DCB7E6&_nc_sid=83d603

清单

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

保存图像的文件图像

For more details look at this image

我应该怎么做才能解决这个错误,或者有什么更好的方法可以做到这一点

使用picasso将图片保存到外部存储,你可以做如下操作

  private Target mTarget = new Target() {
  @Override
  public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
      // Perform simple file operation to store this bitmap
  }

  @Override
  public void onBitmapFailed(Drawable errorDrawable) {
  }

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

...

Picasso.with(this).load("url").into(mTarget);

这里的“Target”是picasso提供的class,理解方法很简单... 这是一个简单的方法

由于缺少提供的代码,很难找出可能导致错误的原因。我最好的猜测是使用 DownloadManager 而不是 AsyncTask。

The download manager is a system service that handles long-running HTTP downloads. Clients may request that a URI be downloaded to a particular destination file. The download manager will conduct the download in the background, taking care of HTTP interactions and retrying downloads after failures or across connectivity changes and system reboots. (https://developer.android.com/reference)

我弄错了。 谢谢大家分享你的想法

con.setDoOutput(真);是一个 POST 方法 而且它不获取任何数据

con.setDoOutput(真);不应使用。