有没有办法只显示带有 webhdfs REST API 的文件?
Is there a way to only display a file with webhdfs REST API?
你好 Whosebug 社区。我最近 运行 遇到了一个关于 webhdfs REST API.
的问题
我在调用 Apache Knox 的应用程序中有一个 servlet 来访问 HDFS 和 HBase这使我无法使用配置文件和 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 , 我不能让这个弹出窗口出现。
- 有没有人知道在使用
OPEN
操作时文档中是否添加了一些数据?
- 如果是这样,有什么办法可以摆脱它吗?
- 还是我遗漏了一些完全不同的东西?
谢谢。
更新
所以显然我的问题没有出现在 Chrome 和 Edge 上,而是 仅 出现在 Firefox(60.6.2esr(32 位))上。
我觉得有点愚蠢,之前没有在其他浏览器上尝试过。我仍然不明白为什么,我找不到解决方案。
另一个更新
我发现了我的问题,请检查我的答案。
经过一番挖掘,我终于找到了。如果您在这里遇到同样的问题,您可能需要验证以下内容:
- 此行为是否出现在其他浏览器上? 在我的情况下没有。
- 此行为是否出现在其他文件中? 在我的情况下没有。
- 当您尝试从本地系统而不是浏览器打开文件时是否会出现此行为? 我的情况是这样。
结论:问题出在 PDF 和查看器上。我没有遇到其他 pdf 和其他查看器的问题。它似乎来自 Adobe Acrobat Document,因为当我尝试在本地打开它时,打印弹出窗口也出现了。
希望对您有所帮助。
PS : 您可能还想检查浏览器的设置,了解它如何处理 pdf。这是一个 link 可以帮助 firefox.
你好 Whosebug 社区。我最近 运行 遇到了一个关于 webhdfs REST API.
的问题我在调用 Apache Knox 的应用程序中有一个 servlet 来访问 HDFS 和 HBase这使我无法使用配置文件和 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 , 我不能让这个弹出窗口出现。
- 有没有人知道在使用
OPEN
操作时文档中是否添加了一些数据? - 如果是这样,有什么办法可以摆脱它吗?
- 还是我遗漏了一些完全不同的东西?
谢谢。
更新
所以显然我的问题没有出现在 Chrome 和 Edge 上,而是 仅 出现在 Firefox(60.6.2esr(32 位))上。 我觉得有点愚蠢,之前没有在其他浏览器上尝试过。我仍然不明白为什么,我找不到解决方案。
另一个更新
我发现了我的问题,请检查我的答案。
经过一番挖掘,我终于找到了。如果您在这里遇到同样的问题,您可能需要验证以下内容:
- 此行为是否出现在其他浏览器上? 在我的情况下没有。
- 此行为是否出现在其他文件中? 在我的情况下没有。
- 当您尝试从本地系统而不是浏览器打开文件时是否会出现此行为? 我的情况是这样。
结论:问题出在 PDF 和查看器上。我没有遇到其他 pdf 和其他查看器的问题。它似乎来自 Adobe Acrobat Document,因为当我尝试在本地打开它时,打印弹出窗口也出现了。
希望对您有所帮助。
PS : 您可能还想检查浏览器的设置,了解它如何处理 pdf。这是一个 link 可以帮助 firefox.