有没有办法只显示带有 webhdfs REST API 的文件?

Is there a way to only display a file with webhdfs REST API?

你好 Whosebug 社区。我最近 运行 遇到了一个关于 webhdfs REST API.

的问题

我在调用 Apache Knox 的应用程序中有一个 servlet 来访问 HDFSHBase这使我无法使用配置文件和 Hadoop 基础 类 来解决我的问题。我在安装 Knox 之前有这个解决方案,它运行良好,但我显然不能再使用它了。

当我使用 API 通过 op=OPEN 操作读取文件时,它会下载文件而不是仅仅显示它。当我通过像 webhdfs/v1/path/to/storage/myPDF.pdf?op=OPEN 这样的 url 直接请求它时,这看起来很正常,但是当我尝试从我的代码中调用这个 URL 时:

public byte[] requestDocumentKnox(String documentID, String documentType) {

    byte[] response = null;

    String surl = TSGVConstantes.KNOX_HDFS + SLASH + "v1" + SLASH + TSGVConstantes.HDFS_PATH + SLASH + documentID + "." + documentType + "?op=OPEN";

    HttpURLConnection connection = null;

    URL url;

    try {

        url = new URL(surl);
        connection = (HttpURLConnection) url.openConnection();

        String encoded = Base64.getEncoder().encodeToString((TSGVConstantes.HADOOP_USER + ":" + TSGVConstantes.KNOX_PASS).getBytes(StandardCharsets.UTF_8));

        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.setRequestProperty("Authorization", "Basic " + encoded);

        if (connection.getResponseCode() != HTTP_CODE_OK) {

            Trace.error(connection.getResponseCode() + " " + connection.getResponseMessage());
        }

        response = IOUtils.toByteArray(connection.getInputStream());

    } catch (IOException ex) {

        Trace.error(ex);

    } finally {

        if (connection != null) {
            connection.disconnect();
        }
    }

    return response;
}

private void returnDocument(HttpServletResponse response, byte[] document, String documentType) throws IOException {

    ServletOutputStream output = null;

    try {

        output = response.getOutputStream();

        if(document != null) {   

            response.setContentType(TSGVConstantes.getMimeTypeMap().get(documentType));

            output.write(document);

        } else {

            // You don't need that
        }

    } catch (IOException ex) {

        Trace.error(ex);

    } finally {

        response.flushBuffer();

        if (output != null) {
            output.close();
        }
    }
}

两种方法都正常工作,它们被一些其他方法调用,returnDocument()的文档参数是requestDocumentKnox()返回的byte[]并且没有no 在调用之间修改该数组。

这确实显示了 PDF,但也打开了我的网络浏览器的打印 window,并告诉我我的 pdf 可能无法正确显示。

我的问题是:我需要摆脱那个打印弹出窗口(和警告),因为我的应用程序在其他人内部调用,以便显示来自 HBase 或 HDFS 的 pdf , 我不能让这个弹出窗口出现。

谢谢。

更新

所以显然我的问题没有出现在 Chrome 和 Edge 上,而是 出现在 Firefox(60.6.2esr(32 位))上。 我觉得有点愚蠢,之前没有在其他浏览器上尝试过。我仍然不明白为什么,我找不到解决方案。

另一个更新

我发现了我的问题,请检查我的答案。

经过一番挖掘,我终于找到了。如果您在这里遇到同样的问题,您可能需要验证以下内容:

  • 此行为是否出现在其他浏览器上? 在我的情况下没有。
  • 此行为是否出现在其他文件中? 在我的情况下没有。
  • 当您尝试从本地系统而不是浏览器打开文件时是否会出现此行为? 我的情况是这样。

结论:问题出在 PDF 和查看器上。我没有遇到其他 pdf 和其他查看器的问题。它似乎来自 Adobe Acrobat Document,因为当我尝试在本地打开它时,打印弹出窗口也出现了。

希望对您有所帮助。

PS : 您可能还想检查浏览器的设置,了解它如何处理 pdf。这是一个 link 可以帮助 firefox.