Есть ли способ отображать только файл с REST API webhdfs? - PullRequest
2 голосов
/ 27 января 2020

Привет сообщество StackOverflow. Недавно я столкнулся с проблемой, связанной с webhdfs REST API .

У меня есть сервлет внутри приложения, вызывающий Apache Knox для доступа к HDFS и HBase , что не позволяет мне использовать файлы конфигурации и базовые классы oop для решения моей проблемы. У меня было это решение до установки Knox, и оно работало нормально, но я, очевидно, больше не могу его использовать.

Когда я использую API для чтения файла с помощью операции op=OPEN, он загружает файл вместо того, чтобы просто показать это. Что кажется нормальным, когда я напрямую запрашиваю его через URL, например 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, но также открывает печать окно моего веб-браузера и говорит мне, что возможно, что мой PDF не будет отображаться правильно.

Моя проблема: Мне нужно избавиться от этого всплывающего окна печати (и предупреждение), потому что мое приложение вызывается внутри других для отображения PDF-файлов из HBase или HDFS, и я не могу позволить этому всплывающему окну появиться.

  • Кто-нибудь из вас знает, есть ли какие-либо данные, добавленные в документ при использовании операции OPEN?
  • Если так, то есть ли способ избавиться от него?
  • Или это что-то совершенно другое, чего мне не хватает?

Спасибо.

ОБНОВЛЕНИЕ

Итак по-видимому, моя проблема не появляется на Chrome или Edge, но ТОЛЬКО на Firefox (60.6.2esr (32 бита)). Я чувствую себя немного глупо, не попробовав это раньше в других браузерах. Тем не менее, я не понимаю, почему, и я не могу найти решение.

ДРУГОЕ ОБНОВЛЕНИЕ

Я нашел свою проблему, проверьте мой ответ.

1 Ответ

0 голосов
/ 28 января 2020

После некоторого копания я наконец узнал. Если у вас возникла та же проблема, вот что вы можете проверить:

  • Появляется ли такое поведение в других браузерах? В моем случае нет.
  • Такое поведение наблюдается с другими файлами? В моем случае нет.
  • Появляется ли такое поведение при попытке открыть файл из локальной системы, а не из браузера? В моем случае так и было.

Вывод: Проблема исходила из PDF и программы просмотра. У меня не было проблемы с другими PDF-файлами и другими зрителями. Похоже, это было из Adobe Acrobat Document , потому что, когда я пытался открыть его локально, всплывающее окно с печатью также обнаруживалось.

Надеюсь, это поможет.

PS: Возможно, вы также захотите проверить настройки вашего браузера относительно того, как он обрабатывает PDF. Вот ссылка, которая может помочь для firefox.

...