Привет сообщество 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 бита)). Я чувствую себя немного глупо, не попробовав это раньше в других браузерах. Тем не менее, я не понимаю, почему, и я не могу найти решение.
ДРУГОЕ ОБНОВЛЕНИЕ
Я нашел свою проблему, проверьте мой ответ.