node代理跨域获取图片

4 篇文章 0 订阅
4 篇文章 0 订阅

我们知道,img标签是不会有跨域的问题的,所以我们可以直接在img标签中利用src属性引用其它域中的图片,但是如果出现下面的情况呢?

<img src="http://pics6.baidu.com/feed/5bafa40f4bfbfbed9f8a1ef376c06332aec31f1a.jpeg?token=7de2efd6c5a751773e7b13a244a38d3f&s=2AFA49850013BFDC2A659CA303003043" alt="图片">
  

我们发现出现了403错误,也就是说,服务器理解我们的请求,但是拒绝为我们服务,这时候该怎么办呢?不慌,下面我们就用服务端的node代理来解决这个问题

目标:在浏览器中输入http://localhost:4000/getPic,显示上面未请求成功的图片

首先,我们用node的http模块,fs模块来获取图片

代码有详细的解释

const http = require("http");
const fs = require('fs')

http.createServer((req, res)=>{
    if(req.url === '/') {
      res.writeHead(200, {'Content-Type': 'text/plain'})
      res.write('Hello World')         
      res.end()
    }
    if(req.url === '/getPic') {
        let url = 'http://pics6.baidu.com/feed/5bafa40f4bfbfbed9f8a1ef376c06332aec31f1a.jpeg?token=7de2efd6c5a751773e7b13a244a38d3f&s=2AFA49850013BFDC2A659CA303003043'
        // 用http的get方法来发送请求
        http.get(url, (resonse)=>{
            //data 存储图片数据,是二进制流 
            var data = "";
            // 一定要设置encode,否则即使在pic/downImg/中有1.jpg,也是无法显示的
            response.setEncoding("binary")
            // 当数据到达时会触发data事件
            response.on('data', function (chunk) {
                    data += chunk;
                });
                // 当数据接收完毕之后,会触发end事件
                response.on("end", function() {
                    // 用fs模块,读取到的图片,放到pic/downImg下,命名为1.jpg
                    // 这里要注意pic和downImg文件夹事先要存在,否则会报错
                    fs.writeFile('../pic/downImg/1.jpg',data, 'binary', (err)=>{
                        if(err) {
                            res.write('error: ' + err.toString())
                            res.end()
                        }else getPic(res) // getPic的作用是把图片返回给浏览器
                    })
                });
            }).on("error", function() {
                console.log('error')
            });
    }
}).listen(4000);

console.log('server listening on port 4000')

到目前为止,我们完成了图片的读取,运行了代码,看下downImg里是否有1.jpg

确实有的,接下来我们就要读取这张图片,返回给浏览器了

 

补上getPic函数

function getPic(res) {
    fs.readFile('../pic/downImg/1.jpg', function(err, data){
        if(err) {
            res.write('error')
        }else {
            // Content-Type的值一定要和返回数据的类型相匹配,否则浏览器是不能正确解析数据的
            res.writeHead(200, {"Content-Type" : "image/jpeg"})
            res.write(data)
        }
        res.end() // 如果end,浏览器会有警告,提醒你请求未结束
    })
}

没有设置Content-Type时,在浏览器中呈现的样子

没有end的时候

警告:请求未结束

好了,最后来看下结果吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Vue的axios库来跨域获取图片并打印。下面是一个简单的示例代码: ```javascript <template> <div> <button @click="getImage">获取图片并打印</button> </div> </template> <script> import axios from 'axios'; export default { methods: { getImage() { const imageUrl = 'http://example.com/image.jpg'; // 替换为你想要获取图片URL axios.get(imageUrl, { responseType: 'blob', // 指定响应类型为二进制文件 headers: { 'Content-Type': 'image/jpeg' // 根据实际情况设置请求头 } }) .then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'image.jpg'); document.body.appendChild(link); link.click(); }) .catch(error => { console.error('获取图片失败:', error); }); } } } </script> ``` 在上面的示例代码中,我们使用了axios库来发送GET请求获取图片数据。设置`responseType`为`blob`,表示响应类型为二进制文件。然后,使用`window.URL.createObjectURL`来创建一个临时的URL,然后创建一个`<a>`标签,设置其`href`属性为临时URL,同时设置`download`属性为想要保存的文件名,最后将该`<a>`标签添加到文档中,并模拟点击该标签来触发下载操作。 请注意,由于浏览器的安全策略,跨域请求可能会受到限制。你需要确保在服务器端设置了正确的CORS(跨域资源共享)配置,允许来自你的Vue应用的域名的请求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值