javascript - Express.js : respond with image file instead of binary file?

标签 javascript reactjs express

在express中,我试图用图像响应React请求,但是,我得到的是图像二进制文件而不是图像文件。

我尝试使用 res.sendFile 和 res.download,但它们发送的是二进制文件。我也尝试了 res.attachment,但它的工作不一致,并且以某种方式使响应挂起。

我尝试使用 res.type("image/jpeg") 指定文件类型,但没有什么区别。

router.get("/photo", (req, res) => {

  res.type("image/jpeg");
  res.sendFile("/absolute/path/image.jpg");

});

我期待一个具有名称、大小等正常属性的图像文件。

最佳答案

我认为您在“图像文件”和“图像二进制文件”之间所做的区别误导了您。所有位图图像文件均以二进制编码(或者,在极少数情况下,以 base64 编码),因此我认为这并不能解决问题的根源。

res.sendFile 应该可以正常工作。问题出在您的客户端 JavaScript 中。

要在浏览器中显示图像数据,您最终必须使用 canvasimg HTML 元素。在应用程序中异步加载图像的最简单方法是将 DOM 中已存在的 img 元素的 src 属性更新为图像的地址,并让浏览器会为您处理加载。

但是,如果您想在将图像数据加载到 imgcanvas 元素之前对其进行操作,我建议使用 FileReader API,而不是手动解析二进制文件。

此方法的关键步骤是在发出 get 请求时将响应数据类型设置为“blob”

blob 数据类型引用二进制图像文件,但允许您使用浏览器的内置File 接口(interface)。

下面的代码请求一个 Blob 形式的图像文件,然后将该 Blob 转换为 Base64 编码的数据 URL,您可以将其用作 img 元素的 src 属性或加载到 Canvas

var xhr = new XMLHttpRequest();
xhr.responseType = "blob";
xhr.onload = function(event) {
fileToDataUrl(event.target.response, function(result){
            console.log(result);
    });
};
xhr.open('GET', "https://i.imgur.com/7VhSUEH.jpg", true);
xhr.send();


function fileToDataUrl(fileObj, callback) {
    var reader = new FileReader();
    reader.addEventListener("load", function() {
    console.log("result")
        callback(reader.result);
    }, false);
    reader.readAsDataURL(fileObj);
}

关于javascript - Express.js : respond with image file instead of binary file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57875010/

相关文章:

javascript - 如何在客户端(AngularJS)加密密码,将其发送到服务器(expressJS)并在服务器上解密?

express:扩展 Express.Request 的项目本地中间件

javascript - Create-react-app 命令不使用 ES6 类

node.js - 如何使用Nginx通过express router加载页面

javascript - 运行 Edge 动画时在 Google Chrome 上遇到双声问题

javascript - 纯 CSS 选项卡试行嵌套输入标签的内容

javascript - Vuetify 错误 - "Cannot read property of ' 扩展“未定义”

javascript - 如何禁用谷歌地图自动完成功能

javascript - React 中的 useEffect 清理函数中的 refs 数组包含空值

reactjs - 蓝色按钮而不是紫色按钮