代码之家  ›  专栏  ›  技术社区  ›  Manvi

从web下载pdf格式的空白页

  •  1
  • Manvi  · 技术社区  · 7 年前

    我正在尝试使用HttpClient下载PDF文件,它正在下载PDF文件,但页面是空白的。如果我打印它们,我可以从响应中看到控制台上的字节。但当我试图将其写入文件时,它会生成一个空白文件。

    FileUtils.writeByteArrayToFile(new File(outputFilePath), bytes);
    

    然而,该文件显示的大小与预期一样正确,分别为103KB和297KB,但它只是一个空白!!

    我尝试了输出流,如:

    FileOutputStream fileOutputStream = new FileOutputStream(outFile);
    fileOutputStream.write(bytes);
    

    还尝试使用UTF-8编码进行编写,如:

    Writer out = new BufferedWriter( new OutputStreamWriter(
                    new FileOutputStream(outFile), "UTF-8"));
            String str = new String(bytes, StandardCharsets.UTF_8);
            try {
                out.write(str);
            } finally {
                out.close();
            }
    

    对我来说什么都不管用。非常感谢您的任何建议。。

    更新:我正在使用DefaultHttpClient。

    HttpGet httpget = new HttpGet(targetURI);
    HttpResponse response = null;
    String htmlContents = null;
    try {
        httpget = new HttpGet(url);
        response = httpclient.execute(httpget);
        InputStreamReader dataStream=new InputStreamReader(response.getEntity().getContent());
        byte[] bytes = IOUtils.toByteArray(dataStream);
    ...
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   mkl    7 年前

    是的

    InputStreamReader dataStream=new InputStreamReader(response.getEntity().getContent());
    byte[] bytes = IOUtils.toByteArray(dataStream);
    

    如评论中所述,使用 Reader 类会损坏二进制数据,例如PDF文件。因此,您不应该将内容包装在 InputStreamReader .

    因为您的内容可用于构建 InputStreamReader 不过我想 response.getEntity().getContent() 返回 InputStream . 这样的 输入流 通常可以直接用作 IOUtils.toByteArray 论点

    因此:

    InputStream dataStream=response.getEntity().getContent();
    byte[] bytes = IOUtils.toByteArray(dataStream);
    

    应该已经为你工作了!

        2
  •  1
  •   DevilsHnd - 退した    7 年前

    下面是我用来从特定URL下载PDF文件的方法。该方法需要两个字符串参数,一个url字符串(示例: "https://www.ibm.com/support/knowledgecenter/SSWRCJ_4.1.0/com.ibm.safos.doc_4.1/Planning_and_Installation.pdf" )以及下载PDF文件(或其他文件)的目标文件夹路径。如果目标路径在本地文件系统中不存在,则会自动创建该路径:

    public boolean downloadFile(String urlString, String destinationFolderPath) {
        boolean result = false; // will turn to true if download is successful
        if (!destinationFolderPath.endsWith("/") && !destinationFolderPath.endsWith("\\")) {
            destinationFolderPath+= "/";
        }
        // If the destination path does not exist then create it.
        File foldersToMake = new File(destinationFolderPath);
            if (!foldersToMake.exists()) {
                foldersToMake.mkdirs();
            }
    
        try {
            // Open Connection
            URL url = new URL(urlString);
            // Get just the file Name from URL
            String fileName = new File(url.getPath()).getName();
            // Try with Resources....
            try (InputStream in = url.openStream(); FileOutputStream outStream = 
                        new FileOutputStream(new File(destinationFolderPath + fileName))) {
    
                // Read from resource and write to file...
                int length = -1;
                byte[] buffer = new byte[1024]; // buffer for portion of data from connection
                while ((length = in.read(buffer)) > -1) {
                    outStream.write(buffer, 0, length);
                }
            }
            // File Successfully Downloaded");
            result = true;
        } 
        catch (MalformedURLException ex) { ex.printStackTrace(); } 
        catch (IOException ex) { ex.printStackTrace(); }
        return result;
    }