有没有一种方法可以只显示带有webhdfs restapi的文件?

xqkwcwgp  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(296)

你好,stackoverflow社区。我最近遇到了一个关于webhdfsrestapi的问题。
我在一个调用apacheknox的应用程序中有一个servlet来访问hdfs和hbase,这使得我无法使用配置文件和hadoop基类来解决问题。我有这个解决方案之前,安装诺克斯和它的工作很好,但我显然不能再使用这个了。
当我使用api读取带有 op=OPEN 操作它下载文件而不是仅仅显示它。这似乎很正常,当我直接要求通过一个网址,如 webhdfs/v1/path/to/storage/myPDF.pdf?op=OPEN 但当我试图从代码中调用此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()byte[] 退回人 requestDocumentKnox() 调用之间没有对数组的修改。
这会显示pdf,但也会打开web浏览器的“打印”窗口,并告诉我可能无法正确显示pdf。
我的问题是:我需要去掉那个打印弹出窗口(和警告),因为我的应用程序在其他程序中被调用,以便显示hbase或hdfs中的pdf,我不能让这个弹出窗口出现。
你们中有人知道在使用 OPEN 手术?
如果是的话,有什么办法可以摆脱它吗?
或者我错过了完全不同的东西?
谢谢您。
更新
显然我的问题并没有出现在chrome和edge上,而只是出现在firefox上(60.6.2esr(32位))。以前没有在其他浏览器上尝试过,我觉得有点傻。我仍然不明白为什么,也找不到解决办法。
另一个更新
我发现了我的问题,检查我的答案。

jljoyd4f

jljoyd4f1#

经过一番挖掘,我终于发现了。如果您在这里遇到同样的问题,您可能需要验证:
这种行为是否出现在其他浏览器上?对我来说没有。
此行为是否与其他文件一起出现?对我来说没有。
当您尝试从本地系统而不是浏览器打开文件时,是否会出现此行为?就我而言,的确如此。
结论:问题来自pdf和查看器。我没有其他PDF和其他观众的问题。它似乎来自adobeacrobat文档,因为当我试图在本地打开它时,打印弹出窗口也出现了。
希望这有帮助。
ps:你可能还想检查一下浏览器的设置,看看它是如何处理pdf的。这里有一个链接可以帮助firefox。

相关问题