【问题标题】:Reading get response with TIFF file in JavaScript在 JavaScript 中使用 TIFF 文件读取获取响应
【发布时间】:2016-10-12 05:04:31
【问题描述】:

我正在开发一个网络应用程序,我尝试在其中显示从服务器请求的 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;
    });

我不知道如何在 JavaScript 中处理响应(响应中的输入流)来读取带有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 文件。

我的回复是这样的:

我不明白那个回复的含义。

那么我如何从这个响应中检索文件?

感谢您的帮助!

【问题讨论】:

  • 请张贴您回复的标题。
  • 常规:请求 URL:localhost:4567/tiff 请求方法:GET 状态码:200 OK 远程地址:[::1]:4567
  • 响应头:Content-Type:image/tiff Server:Jetty(9.0.2.v20130417) Transfer-Encoding:chunked
  • 请求标头:Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8 Cache-Control:max-age=0 Connection:keep -alive Host:localhost:4567 Referer:localhost:4567 User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36 X-Requested-With:XMLHttpRequest跨度>
  • 我的猜测是响应常量类型错误,但它设置为 image/tiff。

标签: javascript java jquery spark-java


【解决方案1】:

根据 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();

在服务器端处理请求并返回原始响应:

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();
});

【讨论】:

    【解决方案2】:

    我更喜欢 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();
    

    【讨论】:

    • 谢谢!它以另一种方式完全解决了我的问题。在这种情况下,我不需要在服务器端进行任何操作,例如处理请求和返回响应,HXLHttpRequest() 会为您完成一切。但我仍然想知道是否可以从服务器端发送的响应中读取文件的字节并从中组装 JavaScript 文件?
    • 你想用从服务器接收到的字节创建一个 js 文件吗?
    • 是的,没错!这就是我试图解决的问题,当我从服务器端(Java)的文件中读取字节时 byte[] bytes = Files.readAllBytes(Paths.get("temp/201600004068.tif"));并发送给他们作为回应。当响应被捕获时,我一直在组装 JavaScript 文件。如何从中创建“新 Tiff”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2014-11-26
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多