从Express服务器下载文件



我尝试从Express服务器下载文件。我确信文件的位置很好。它不会出现错误,但无论如何都没有下载该文件。

NodeJS:

const DOWNLOAD_FOLDER = 'downloads'
const IMAGES_FOLDER = 'images'
const express = require('express')
const fs = require('fs')

const app = express()
app.post('/', urlencodedParser, async (req, resp, next) => {    
const filename = `test_file.zip`
const downloadUrl = `./${DOWNLOAD_FOLDER}/${filename}.zip`

if (fs.existsSync(downloadUrl)) {
resp.download(`${__dirname}/${downloadUrl}`, (err) => {
if (err) {
console.log(err)
} else {
console.log('success')
}
})
}
})

app.listen(5000).setTimeout(500000)
app.use(express.static(__dirname))

在控制台中,我看到一个控制台日志("成功"(,但我的浏览器没有下载文件。

反应:

const submitHandler = async (e) => {
e.preventDefault()
setLoading(true)
await fetch('http://localhost:5000/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ 'url': data.url})
})
.then((data) => {
console.log('data', data)
setLoading(false)
setData({ url: '' })
})
.catch(err => {
throw new Error(err)
})
}

我认为没有必要发出获取请求。您可以通过请求通过express解析具有文件名的路由来仅请求URL。在客户端,您设置以下内容:

window.location = `http://localhost:5000/${data.url}`

在快速方面,您将方法从post更改为get。您必须保持逻辑,以便查看要动态解析的路由和文件。

编辑:带有fetch的解决方案。还需要指示浏览器下载文件,例如通过设置window.location

fetch(url).then(r => r.blob())
.then(img => {
imgURL = URL.createObjectURL(img)
window.location = imgURL;
})

最新更新