【问题标题】:Java status 400 for URLURL 的 Java 状态 400
【发布时间】:2017-11-28 13:47:31
【问题描述】:

您好 - 我正在尝试使用 Apache commons fileUtils 下载文件,但它总是会收到 400 错误。该文件的 URL 是有效的,因为我使用浏览器成功下载了很多次。有什么想法吗?

java.io.IOException:服务器返回 HTTP 响应代码:400 用于 URL: http://www.nikaia-hosp.gr/img/ΤΕΛΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ ΓΙΑ ΥΠΕΡΗΧΟ ΓΥΝΑΙΚΟΛΟΓΙΚΟ ΜΑΙΕΥΤΙΚΟ ΠΡΟΓΕΝΝΗΤΙΚΟΥ ΕΛΕΓΧΟΥ.pdf at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) 在 java.net.URL.openStream(URL.java:1045) 在 org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:1478) 在 com.nikaia.main.NikaiaReader.Downloader.download(Downloader.java:17) 在 com.nikaia.main.NikaiaReader.Downloader.main(Downloader.java:32)

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.io.FileUtils;

public class Downloader {

    public static void download(String url,String filename){

        //System.out.println("filename is : "+filename);
        try {
        //  FileUtils.copyURLToFile(new URL(url), new File("C:/downloads/"+filename));
                FileUtils.copyURLToFile(new URL(url), new File(PropertyReader.readProperty("ExtractedFilesPath")+"/"+filename));
            try {
                Thread.sleep(Integer.parseInt(PropertyReader.readProperty("downloadTimeout"))*1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String ar[]){
        download("http://www.nikaia-hosp.gr/img/ΤΕΛΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ ΓΙΑ ΥΠΕΡΗΧΟ ΓΥΝΑΙΚΟΛΟΓΙΚΟ ΜΑΙΕΥΤΙΚΟ ΠΡΟΓΕΝΝΗΤΙΚΟΥ ΕΛΕΓΧΟΥ.pdf","stupid.pdf");
    }
}

【问题讨论】:

  • 我试过了,现在我得到 java.net.MalformedURLException : no protocol .. http%3A%2F%2Fwww.nikaia-hosp.gr%2Fimg%2F%C .... 一个非常日志字符串
  • 下载(“nikaia-hosp.gr/img/"+URLEncoder.encode("ΤΕΛΙΚΕΣπροδιαγρπερηχυνυνυνιυεοχιΚομρΕυυννΚοπΕλλχχυ.pdf”),“stup.pdf”); span>
  • 仍然没有协议...
  • 我认为错误的请求错误是由于您的网址中的空格造成的。浏览器能够处理这个。在代码中我们需要处理这个

标签: java apache file download


【解决方案1】:

找到好的答案,我检查了编码的浏览器 url 和 UTF-8 java 返回的 url,不同之处在于浏览器在 url 中有 %20 而 java 有 + 。 我在 java 中用 %20 替换了所有 + 及其工作。

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import org.apache.commons.io.FileUtils;

public class Downloader {

    public static void download(String url, String filename) {

        try {

            String base = "http://www.nikaia-hosp.gr/img/";
            if (url.contains("http://www.nikaia-hosp.gr/img/")) {
                FileUtils.copyURLToFile(
                        new URL(base + URLEncoder.encode(url.replace(base, ""), "UTF-8").replaceAll("\\+", "%20")),
                        new File(PropertyReader.readProperty("ExtractedFilesPath") + "/" + filename));
            } else {
                FileUtils.copyURLToFile(new URL(url),
                        new File(PropertyReader.readProperty("ExtractedFilesPath") + "/" + filename));
            }

            try {
                Thread.sleep(Integer.parseInt(PropertyReader.readProperty("downloadTimeout")) * 1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String ar[]) {
        download(
                "http://www.nikaia-hosp.gr/img/ΤΕΛΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ ΓΙΑ ΥΠΕΡΗΧΟ ΓΥΝΑΙΚΟΛΟΓΙΚΟ ΜΑΙΕΥΤΙΚΟ ΠΡΟΓΕΝΝΗΤΙΚΟΥ ΕΛΕΓΧΟΥ.pdf",
                "stupid.pdf");
    }
}

【讨论】:

    【解决方案2】:

    这对我有用,问题是编码,你只需要编码 url 的路径

    InputStream in = new URL(url).openStream();
    FileUtils.copyToFile(in,new File(filename));
    

    首先打开一个带有 url 的 Stream,然后将这个流数据复制到一个文件中。使用copyToFile方法

    你的代码将是

    public static void download(String url,String filename){
    
            try {
                   //changed this 2 lines    
                   URL encodeUrl = new URL(UriUtils.encodePath(url, "UTF-8"));
                   InputStream in = encodeUrl.openStream(); 
                   FileUtils.copyToFile(in, new File(PropertyReader.readProperty("ExtractedFilesPath")+"/"+filename));
    
                try {
                    Thread.sleep(Integer.parseInt(PropertyReader.readProperty("downloadTimeout"))*1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    public static void main(String ar[]){
            download("http://www.nikaia-hosp.gr/img/ΤΕΛΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ ΓΙΑ ΥΠΕΡΗΧΟ ΓΥΝΑΙΚΟΛΟΓΙΚΟ ΜΑΙΕΥΤΙΚΟ ΠΡΟΓΕΝΝΗΤΙΚΟΥ ΕΛΕΓΧΟΥ.pdf","stupid.pdf");
    }
    

    并将此依赖项添加到您的 pom.xml

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.0.4.RELEASE</version>
    </dependency>
    

    这很神奇。

    UriUtils.encodePath(host+path, "UTF-8");
    

    【讨论】:

    • 你能提供完整的代码吗?试图改变这些行,但我得到 404
    • 让我粘贴一下
    • 不工作服务器返回HTTP响应代码:400用于URL:nikaia-hosp.gr/img/ΤΕΛΙΚΕΣπροδιαγραφεςγιαυυεεοχιυνυνιΕυυκιΚοπΕλΕυννκικυΕλεγους.pdf spr>
    • 抱歉更改url编码后重试
    • 但是我将如何获得该网址?我的网址是nikaia-hosp.gr/img/ΤΕΛΙΚΕΣ ΠΡΟΔΙΑΓΡΑΦΕΣ ΓΙΑ ΥΠΕΡΗΧΟ ΓΥΝΑΙΚΟΛΟΙΚΟ ΜΑΙΕΥΤΙΚΟ ΠΡΟΓΕΝΝΗΤΙΚΟΥΕΛΕΧΟΥ.pdf
    猜你喜欢
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多