不使用HttpUrlConnection.getInputStream和FileUtils.copyInputStreamToFile下载docx和xlsx文件

时间:2015-12-23 19:23:02

标签: java excel ms-word httpurlconnection fileutils

我试图通过webdav下载一些文件。我有一些代码似乎适用于除Microsoft文件以外的所有文件。 (例如,docx,xl​​sx)通过" work",我的意思是说我运行程序,我可以在我指示保存的地方找到该文件。

以下是代码:

    String[] folderPaths = path.split("/");
    String fileName = folderPaths[folderPaths.length - 1];

    String webdavURL = "https://" + WEB_HOST + "/webdav/";

    if(path.startsWith("/"))
            path = path.replaceFirst("/","");

    //System.out.println(webdavURL + folder + fileName);
    java.net.URL url = new java.net.URL(webdavURL + path);
    java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();

    //conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestMethod("GET");
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setRequestProperty("Authorization", "Basic " + new String(new org.apache.commons.codec.binary.Base64().encode("un:pw".getBytes())));
    conn.setRequestProperty("User-Agent","curl/7.37.0");
    conn.setRequestProperty("Host", WEB_HOST);
    conn.setRequestProperty("Accept", "*/*");
    //conn.setRequestProperty("Content-Length", String.valueOf(fileContents.length));
    //conn.setRequestProperty("Expect", "100-continue");
    org.apache.commons.io.FileUtils.copyInputStreamToFile(conn.getInputStream(), file);

    //org.apache.commons.io.FileUtils.writeByteArrayToFile(file, org.apache.commons.io.IOUtils.toByteArray(conn.getInputStream()));

    Integer returnCode = conn.getResponseCode();

    java.io.InputStream errorStream = conn.getErrorStream();

    if(errorStream != null)
        System.out.println(org.apache.commons.io.IOUtils.toString(conn.getErrorStream()));

    java.util.Map<String, java.util.List<String>> map = conn.getHeaderFields();
    for (java.util.Map.Entry<String, java.util.List<String>> entry : map.entrySet()) {
        System.out.println("Key : " + entry.getKey() + 
             " ,Value : " + entry.getValue());
    }

    conn.disconnect();

    return returnCode;

如您所见,我正在打印一些行以进行调试。

以下是成功下载的响应标题:

Key : null ,Value : [HTTP/1.1 200 OK]
Key : ETag ,Value : ["179614-BA45C8F60456A672E003A875E469D0EB"]
Key : Content-Length ,Value : [845941]
Key : Expires ,Value : [-1]
Key : Last-Modified ,Value : [Fri, 04 Apr 2014 14:13:54 GMT]
Key : Set-Cookie ,Value : [stuff]
Key : X-Powered-By ,Value : [ARR/2.5]
Key : Server ,Value : [Microsoft-IIS/7.5]
Key : Cache-Control ,Value : [private]
Key : Pragma ,Value : [private]
Key : Date ,Value : [Wed, 23 Dec 2015 19:01:39 GMT]
Key : P3P ,Value : [CP="CAO PSA OUR"]
Key : Content-Type ,Value : [image/jpeg]
Key : Accept-Ranges ,Value : [bytes]

以下是xlsx文件的响应标头:

Key : null ,Value : [HTTP/1.1 200 OK]
Key : ETag ,Value : ["205147-70BDF9AF17A2F13756A21AE50EB88DFF"]
Key : Content-Length ,Value : [48002]
Key : Expires ,Value : [-1]
Key : Last-Modified ,Value : [Fri, 29 Aug 2014 20:27:51 GMT]
Key : Set-Cookie ,Value : [stuff]
Key : X-Powered-By ,Value : [ARR/2.5]
Key : Server ,Value : [Microsoft-IIS/7.5]
Key : Cache-Control ,Value : [private]
Key : Pragma ,Value : [private]
Key : Date ,Value : [Wed, 23 Dec 2015 19:01:38 GMT]
Key : P3P ,Value : [CP="CAO PSA OUR"]
Key : Content-Type ,Value : [application/x-www-form-urlencoded]
Key : Accept-Ranges ,Value : [bytes]

我真的不知道这里可能会出现什么问题。我从服务器得到200响应,并且没有报告错误或异常。

唯一突出的是,当我尝试下载xlsx文件时,Content-Type为application/x-www-form-urlencoded而其他任何东西,内容类型实际上列出了它的文件类型。我不会想到那会有所作为。

任何想法都将非常感谢!

1 个答案:

答案 0 :(得分:0)

conn.setDoInputconn.setDoOutput。评论那些使它成功。我真的不知道他们做了什么;我刚刚从之前的项目中复制了这段代码。