当前位置: 首页 > 知识库问答 >
问题:

无法读取文档URL:无法读取整个标题;6字节读取;应为32字节

宰父智敏
2023-03-14
String url = "http://prevention.cancer.gov/sites/default/files/uploads/clinical_trial/Master-DMP-Template.doc";
InputStream inputStream = new URL(urlString).openStream();
HWPFDocument doc = new HWPFDocument(inputStream);
WordExtractor extractor = new WordExtractor(doc);
String text = extractor.getText();

尝试2:有趣的部分是下载文件(只是在浏览器地址栏中粘贴URL),然后执行类似的代码在本地读取文档确实有效:

InputStream inputStream = new FileInputStream("C:\\Users\\me\\Downloads\\Master-DMP-Template (2).doc");
HWPFDocument doc = new HWPFDocument(inputStream);
WordExtractor extractor = new WordExtractor(doc);
System.out.println(extractor.getText());

尝试3:现在是最奇怪的部分。我想文件需要先下载。因此,我首先使用Java下载了它,然后在本地执行前面的代码来读取文档。像第一个案例一样失败!

final String url = "http://prevention.cancer.gov/sites/default/files/uploads/clinical_trial/Master-DMP-Template.doc";
String localPath  = FileUtils.downloadFile("C:\\Users\\me\\Downloads", url);
InputStream inputStream = new FileInputStream(localPath);
HWPFDocument doc = new HWPFDocument(inputStream);
WordExtractor extractor = new WordExtractor(doc);
System.out.println(extractor.getText());

public static String downloadFile(String targetDir, String sourceUrl) throws IOException {
    sourceUrl = StringUtils.removeEnd(sourceUrl, "/");
    String fileName = sourceUrl.substring(sourceUrl.lastIndexOf("/") + 1);
    String targetPath = targetDir + FileUtils.SEPARATOR + fileName;
    InputStream in = new URL(sourceUrl).openStream();
    Files.copy(in, Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Downloaded " + sourceUrl + " to " + targetPath);
    return targetPath;
}

你知道这是怎么回事吗?

public static void main(String[] args) {
    try {
        if (args.length > 0 && args[0].equals("disableCertValidation")) {
            SSLUtil.disableCertificateValidation(); // redirect is https
        }
        final String stringURL = "https://prevention.cancer.gov/sites/default/files/uploads/clinical_trial/Master-DMP-Template.doc";
        URL url = new URL(stringURL);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        int responseCode = con.getResponseCode();
        System.out.println("Response code: " + responseCode); //301 Moved Permanently
        InputStream in = con.getInputStream();
        HWPFDocument doc = new HWPFDocument(in);
        WordExtractor extractor = new WordExtractor(doc);
        String text = extractor.getText();
        System.out.println(text);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
int responseCode = con.getResponseCode();

以下异常失败:javax.net.ssl.sslhandShakeException:sun.security.validator.validatoreXception:PKIX路径构建失败:sun.security.provider.certPath.SunCertPathBuilderException:找不到请求目标的有效证书路径

当运行带有disableCertificateValidation参数的代码时,响应代码为404,我得到以下异常:

java.io.fileNotFoundException:https://prevention.cancer.gov/sites/default/files/uploads/clinical_trial/master-dmp-template.doc at sun.reflect.nativeconstructoraccessorimpl.newinstance0(原生方法)at sun.reflect.nativeconstructoraccessorimpl.newinstance0(原生方法)at sun.reflect.nativeconstructoraccessorimpl.newinstance(原生方法)at lconnection.java:1890)在sun.net.www.protocol.http.http.httpurlconnection$10.run(httpurlconnection.java:1885)在sun.net.www.protocol.http.http.httpurlconnection.getChainedException(httpurlconnection.java:1885)在sun.net.www.protocol.http.httppurlconnection.getInputStream(httpurlconnection.java:1441)在sun.net.www.protocol.https.httpsurlconnectionimpl.getInputStream(httpsurlconnectionimpl.java:254)在com.keywords.control.util.testhtmlparser.main(Testhtmlparser.java:472)由:java.io.filenotfoundexception:https://prevention.cancer.gov/sites/default/files/uploads/clinical_trial/master-dmp-template.doc在sun.net.www.protocol.https.httpsurlconnectionimpl.getresponseCode(httpsurlconnectionimpl.java:480)在com.keywords.control.util.testhtmlparser.main(Testhtmlparser.java:470)

有什么想法吗?

共有1个答案

凌鹏程
2023-03-14

URL的初始HTTP请求导致一个重定向301永久移动。所以我们需要处理这个并读取新的位置。

完整示例:

import java.io.InputStream;
import java.net.URL;
import java.net.HttpURLConnection;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;

public class OpenHWPFFromURL {

 public static void main(String[] args) throws Exception {

  String stringURL = "http://prevention.cancer.gov/sites/default/files/uploads/clinical_trial/Master-DMP-Template.doc";

  URL url = new URL(stringURL);
  HttpURLConnection con = (HttpURLConnection)url.openConnection();

  int responseCode = con.getResponseCode();
  System.out.println(responseCode); //301 Moved Permanently

  if (responseCode != HttpURLConnection.HTTP_OK) {
   if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP
       || responseCode == HttpURLConnection.HTTP_MOVED_PERM
       || responseCode == HttpURLConnection.HTTP_SEE_OTHER) {
    url = new URL(con.getHeaderField("Location")); //get new location
    con = (HttpURLConnection)url.openConnection();
   }   
  }

  InputStream in = con.getInputStream();
  HWPFDocument doc = new HWPFDocument(in);
  WordExtractor extractor = new WordExtractor(doc);
  String text = extractor.getText();

  System.out.println(text);

 }
}

注意:简单地将httpurlconnection.setfollredirects设置为true(也是默认值),如果重定向还更改了协议(例如,从http设置为https)的话,将没有帮助。这里的情况也是如此。因此,我们需要手动获取新的位置,如我的代码所示。

 类似资料:
  • 我正在编写一个Qt GUI应用程序,它通过串行方式接收数据并将数据发送到Arduino。它写得正确,但当尝试阅读时,它不起作用。 我的问题是: 我有一个Arduino代码可以通过串行方式发送信息,我将其编程为根据接收到的数据打开和关闭针脚13上的LED: 我在MainWindow类中使用以下信号和插槽: 以及前一个插槽调用的Arduino::Read()方法: 当向Arduino写入数据时,它工作

  • 问题内容: 我想读取.bak文件,这些文件是ms sql数据库的备份文件。现在,我正在研究如何使用Sql Mngmnt studio读取这些文件。请帮帮我。谢谢 问题答案: 您可以使用SQL Management Studio将.BAK文件还原到临时数据库并读取它们! 这里的一些指针

  • 我已经按照下面的链接使用spring的Swagger为我的REST服务创建API文档。 http://jakubstas.com/spring-jersey-swagger-configuration/#comment-1726 一切都很顺利,但当我试图使用url http://localhost:8080/rest/api-docs访问swagger的api文档时,我发现无法读取swagger

  • 我正在尝试使用clojure创建一个简单的android应用程序,它可以读取csv文件,并允许用户对数据进行类似正则表达式的搜索。问题是,当我尝试读取数据时,会出现以下异常。 我的研究表明,这通常意味着Clojure正在寻找某样东西,但找不到。但是我不知道它可能是什么或者为什么。 下面是引发异常的Clojure代码: 据我所知,“kamus.csv”在正确的目录中,所以我不认为是这样。如果我在re

  • 我一直在到处寻找答案,但没有任何帮助。 这是我的代码: 当我试图读取URL时,下面出现了一个异常。 任何帮助都会很好。我正在尝试读取url内部的图像,并将其与现有文件进行比较。这里没有任何问题给出答案。 编辑: 我尝试在命令行“keytool-list-keystore keystore”中输入,但它只显示给我TrustedCertentries。还没有解决方案奏效。

  • bufferedinputstream(BIS)比FileInputStream(FIS)快的原因请参见“为什么使用bufferedinputstream逐字节读取文件比使用FileInputStream快?”?是吗 使用BufferedInputStream,该方法委托给重载read()方法,该方法读取8192个字节,并在FIS读取单个字节时缓冲它们,直到需要它们 据我所知,磁盘是一个“块设备”