在 JavaScript 中读取 TIFF 文件得到响应
Reading get response with TIFF file in JavaScript
我正在开发一个 Web 应用程序,我试图在其中显示从服务器请求的 TIFF 文件。我使用 this approach 来显示 TIFF 文件,但我需要通过 GET 请求从服务器获取图像,而不是从本地计算机打开文件。
在服务器端,我使用 Spark-Java 框架来发送响应。这是用于此目的的 Java 代码:
get("tiff", (request, response) -> {
byte[] bytes = Files.readAllBytes(Paths.get("temp/201600004068.tif"));
HttpServletResponse raw = response.raw();
raw.setContentType("image/tiff");
raw.getOutputStream().write(bytes);
raw.getOutputStream().flush();
raw.getOutputStream().close();
return raw;
});
我不知道如何处理 Java 脚本中的响应(响应中的输入流)以使用 FileReader()
读取文件。
$.get( "/tiff", function( data ) {
var parentEl = $(this).parent();
var fr = new FileReader();
fr.onload = function(e) {
//Using tiff.min.js library - https://github.com/seikichi/tiff.js/tree/master
console.debug("Parsing TIFF image...");
//initialize with 100MB for large files
Tiff.initialize({
TOTAL_MEMORY: 100000000
});
var tiff = new Tiff({
buffer: e.target.result
});
var tiffCanvas = tiff.toCanvas();
$(tiffCanvas).css({
"max-width": "1000000px",
"width": "100%",
"height": "auto",
"display": "block",
"padding-top": "10px"
}).addClass("preview");
$(parentEl).append(tiffCanvas);
}
fr.onloadend = function(e) {
console.debug("Load End");
}
fr.readAsArrayBuffer(data); });
当我尝试将响应直接放入 fr.readAsArrayBuffer(data);
时,出现错误 Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'
。
当我尝试根据响应创建 Blob 时
var blob = new Blob([data], {type: 'image/tiff'});
fr.readAsArrayBuffer(blob);
无法解析 TIFF 文件。
我的回复是这样的:
我不明白那个回复的意思。
那么如何从此响应中检索文件?
感谢您的帮助!
我更喜欢 XMLHttpRequest。由于您正在写入字节,因此您可以在 XMLHttpRequest 中将数据作为数组缓冲区获取。
var xhr = new XMLHttpRequest();
xhr.open('GET', "assets/tif/sample.tif", true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
var arrayBuffer = this.response;
Tiff.initialize({
TOTAL_MEMORY: 100000000
});
var tiff = new Tiff({
buffer: arrayBuffer
});
var dataUrI = tiff.toDataURL();
console.log(dataUrI);
};
xhr.send();
根据 Sandeep 的回答,我成功地实现了我的问题目标。
可以使用 XMLHttpRequest() 来读取服务器的原始响应,而不是从源文件夹中读取。
因此,从 javaScript 请求图像:
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.open('get', "/image?imageName=" + imageName);
xhr.onload = function ( e ) {
Tiff.initialize({
TOTAL_MEMORY: 100000000
});
var tiff = new Tiff({
buffer: arrayBuffer
});
*//...Any manipulation with tiff file*
};
xhr.send();
在服务器端处理请求和return原始响应:
get("/image", (request, response) -> {
String imageName = request.queryParams("imageName");
response.raw().setContentType("image/tiff");
response.raw().setHeader("Content-Disposition","attachment; filename=image.tiff");
Path path = Paths.get(IMAGE_DESTINATION + "/" + imageName);
byte[] data = null;
try {
data = Files.readAllBytes(path);
} catch (Exception e) {
e.printStackTrace();
}
OutputStream out = response.raw().getOutputStream();
out.write(data);
out.flush();
out.close();
return response.raw();
});
我正在开发一个 Web 应用程序,我试图在其中显示从服务器请求的 TIFF 文件。我使用 this approach 来显示 TIFF 文件,但我需要通过 GET 请求从服务器获取图像,而不是从本地计算机打开文件。
在服务器端,我使用 Spark-Java 框架来发送响应。这是用于此目的的 Java 代码:
get("tiff", (request, response) -> {
byte[] bytes = Files.readAllBytes(Paths.get("temp/201600004068.tif"));
HttpServletResponse raw = response.raw();
raw.setContentType("image/tiff");
raw.getOutputStream().write(bytes);
raw.getOutputStream().flush();
raw.getOutputStream().close();
return raw;
});
我不知道如何处理 Java 脚本中的响应(响应中的输入流)以使用 FileReader()
读取文件。
$.get( "/tiff", function( data ) {
var parentEl = $(this).parent();
var fr = new FileReader();
fr.onload = function(e) {
//Using tiff.min.js library - https://github.com/seikichi/tiff.js/tree/master
console.debug("Parsing TIFF image...");
//initialize with 100MB for large files
Tiff.initialize({
TOTAL_MEMORY: 100000000
});
var tiff = new Tiff({
buffer: e.target.result
});
var tiffCanvas = tiff.toCanvas();
$(tiffCanvas).css({
"max-width": "1000000px",
"width": "100%",
"height": "auto",
"display": "block",
"padding-top": "10px"
}).addClass("preview");
$(parentEl).append(tiffCanvas);
}
fr.onloadend = function(e) {
console.debug("Load End");
}
fr.readAsArrayBuffer(data); });
当我尝试将响应直接放入 fr.readAsArrayBuffer(data);
时,出现错误 Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'
。
当我尝试根据响应创建 Blob 时
var blob = new Blob([data], {type: 'image/tiff'});
fr.readAsArrayBuffer(blob);
无法解析 TIFF 文件。
我的回复是这样的:
我不明白那个回复的意思。
那么如何从此响应中检索文件?
感谢您的帮助!
我更喜欢 XMLHttpRequest。由于您正在写入字节,因此您可以在 XMLHttpRequest 中将数据作为数组缓冲区获取。
var xhr = new XMLHttpRequest();
xhr.open('GET', "assets/tif/sample.tif", true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
var arrayBuffer = this.response;
Tiff.initialize({
TOTAL_MEMORY: 100000000
});
var tiff = new Tiff({
buffer: arrayBuffer
});
var dataUrI = tiff.toDataURL();
console.log(dataUrI);
};
xhr.send();
根据 Sandeep 的回答,我成功地实现了我的问题目标。 可以使用 XMLHttpRequest() 来读取服务器的原始响应,而不是从源文件夹中读取。
因此,从 javaScript 请求图像:
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.open('get', "/image?imageName=" + imageName);
xhr.onload = function ( e ) {
Tiff.initialize({
TOTAL_MEMORY: 100000000
});
var tiff = new Tiff({
buffer: arrayBuffer
});
*//...Any manipulation with tiff file*
};
xhr.send();
在服务器端处理请求和return原始响应:
get("/image", (request, response) -> {
String imageName = request.queryParams("imageName");
response.raw().setContentType("image/tiff");
response.raw().setHeader("Content-Disposition","attachment; filename=image.tiff");
Path path = Paths.get(IMAGE_DESTINATION + "/" + imageName);
byte[] data = null;
try {
data = Files.readAllBytes(path);
} catch (Exception e) {
e.printStackTrace();
}
OutputStream out = response.raw().getOutputStream();
out.write(data);
out.flush();
out.close();
return response.raw();
});