举个简单的例子,用户选择图片,点击上传之后,需要把上传成功的图片显示出来,这个怎么实现?

在上一篇文章,我们通过multer实现了文件的上传,通过前端发送一个ajax到服务器,就搞定了。同时我们也知道了,在服务器通过request.file.filename可以得知服务器中文件的 “路径/文件名” 。这时候,是不是联想到什么?

当我们在服务端的回调函数里面写上response.write(request.file.path),前端就可以通过xhr.resposetext看到后端写过来的数据,也就知道文件存在哪了。

最后,我们把获取到的图片路径用js拼接到img元素的src中,前端就可以解析到这张图。

但是要注意的是,单单是给img的src写上图片地址还不够。原因是src也是一种请求,需要往后端获取资源,就得让后端提前实现获取图片的接口。

整个过程有点绕,不过实现起来并不是很难。跟前面的几篇文章提到的一样,这里实现图片的显示也是通过app.get(“接口”,”回调函数”)这样的方式实现。

下面开始贴显示图片的代码:

第一步,上传图片之后,web层返回的一串数据:

function uploadControl(request, response) {
 

    response.write(request.file.path)
    response.end()
}
module.exports = uploadControl

当文件上传之后(续上一篇文章),后端给前端返回了一个文件在服务器端的路径。

第二步,前端接收这个路径,并拼接给img:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <input id="file" type="file">
    <input type="button" onclick="upload()" value="send">

    <img id="pic" src="#">
<script>
    function upload() {
        console.log(22)
        var file = document.getElementById("file").files[0]

        var form = new FormData()
        form.append("file", file)
        console.log(file)

        var xhr = new XMLHttpRequest()
        xhr.open("post", "/upload", true)
        xhr.onload = function () {
            alert("上传成功")
        }
        xhr.send(form)
        xhr.onreadystatechange=()=>{
            if (xhr.readyState == 4 && xhr.status == 200){}
            console.log(xhr.responseText)

            document.getElementById("pic").src = "/getPath?path=" + xhr.responseText

        }

    }

</script>
</body>
</html>

通过上面代码,上传成功之后控制台会输出服务器端返回的一个路径,即xhr.responseText::

file\1dafabab8e6d00a32391bc4465d56665

1dafabab8e6d00a32391bc4465d56665 是上传的文件名,服务器为了避免文件重名造成覆盖问题,自动生成了一串代码。

file就是文件所在服务器的文件夹

我们利用这个返回的路径,再访问一次后端提供给我们的接口/getPath:

document.getElementById("pic").src = "/getPath?path=" + xhr.responseText

第三步,img也有自己的接口

通过访问这个接口,我们希望后端给我们找到刚刚上传到服务器的图片,服务器端代码如下:

app.get("/getPath", (request, response)=>{
    var params = url.parse(request.url, true).query
 
    var path = params.path
    try{ 
        var data = fs.readFileSync("./" + path)
  
        response.writeHead(200)
        response.write(data)
        response.end()
    }catch (e){
        response.writeHead(404)
        response.end()

    }
})

由于是通过src直接访问接口,所以接口返回的数据直接渲染到img元素上面,不需要进行其他操作,到此,图片的显示完成。

如何实现文件的下载?html的超链接a元素就可以轻松实现,不过也有一个前提,a元素的href路径正确,通过a元素的download属性,可以设置下载文件的文件名。例如:

<a href="/getPic?path='1dafabab8e6d00a32391bc4465d56665'" download="2.png">点击下载</a>

就这么简单,通过express实现图片的显示与文件的下载,轻松提高开发效率