无法通过我的前端从我的节点 js 服务器下载图像文件(我的后端和前端是分离的)
Failed to download an image file from my node js server through my frontend (my backend and frontend are decoupled)
我的 nodejs 后端在 localhost:8080 上是 运行,前端在 localhost:8081 上使用 http-server,我无法将文件从服务器端下载到客户端,我是 node js 的新手,所以遇到了一些问题
我试过的
我在服务器端为我所需的文件创建了一个读取流,然后将其通过管道传输到 res object,我还设置了一些 headers :-
res.setHeader("Content-Type","image/png") // as I am trying to download a
res.setHeader("Content-Disposition", `inline; filename=${filename}`);
但还是失败了
代码:-
从服务器端下载文件的代码
let filename = "hello.png";
let readStream = fs.createReadStream(path.join(__dirname, "..", chatDoc.chatContent));
res.setHeader("Content-Type", "image/png")
res.setHeader("Content-Disposition", `inline; filename=${filename}`);
readStream.pipe(res);
cors 代码:-
const cors = require("cors");
app.use(cors({
origin: "http://localhost:8081",
credentials: true,
withCredentials: true
}))
前端代码:-
fetch("http://localhost:8080/downloadNow",{
method:"POST",
headers:{
"Content-Type":"application/json"
},
body:JSON.stringify({
chatId:chatId
}),
credentials:"include"
})
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err);
})
前端响应:-
我从服务器成功响应,但文件未下载。
请帮我解决这个问题
试试这个
服务器
let mime = {
html: 'text/html',
txt: 'text/plain',
css: 'text/css',
gif: 'image/gif',
jpg: 'image/jpeg',
png: 'image/png',
svg: 'image/svg+xml',
js: 'application/javascript'
};
app.post('/imageDownload', async(req, res) => {
var type = mime[path.extname(req.body.imagePath).slice(1)] ||
'text/plain';
var s = fs.createReadStream(file);
s.on('open', function () {
res.set('Content-Type', type);
s.pipe(res);
});
s.on('error', function (err) {
console.log(err)
res.send(err)
});
}
客户
fetch(`/imageDownload`,{
method: 'POST',
headers:{
"Content-Type":"application/json"
},
body:JSON.stringify({
imagePath:url
}),
}).then(response => response.blob())
.then(function(myBlob) {
const url = window.URL.createObjectURL(new Blob([myBlob]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', "filename.jpg");
document.body.appendChild(link);
link.click();
})
这是所有处理下载的服务器代码吗?如果是,则您没有等待 readStream
正确打开。当无法打开 readStream 时,您还应该添加适当的错误处理。使用
let readStream = fs.createReadStream(path.join(__dirname, "..", chatDoc.chatContent));
readStream.on("open", () => {
res.setHeader("Content-Type","image/png")
res.setHeader("Content-Disposition", `inline; filename=${filename}`);
readStream.pipe(res);
})
readStream.on("error", e => {
console.log(e);
res.writeHead(400);
});
并使用 fetch
下载文件(在我的理解中,这意味着将文件保存到磁盘而不是在浏览器中显示)您仍然需要应用 的方法。 ..
我的 nodejs 后端在 localhost:8080 上是 运行,前端在 localhost:8081 上使用 http-server,我无法将文件从服务器端下载到客户端,我是 node js 的新手,所以遇到了一些问题
我试过的
我在服务器端为我所需的文件创建了一个读取流,然后将其通过管道传输到 res object,我还设置了一些 headers :-
res.setHeader("Content-Type","image/png") // as I am trying to download a
res.setHeader("Content-Disposition", `inline; filename=${filename}`);
但还是失败了
代码:-
从服务器端下载文件的代码
let filename = "hello.png";
let readStream = fs.createReadStream(path.join(__dirname, "..", chatDoc.chatContent));
res.setHeader("Content-Type", "image/png")
res.setHeader("Content-Disposition", `inline; filename=${filename}`);
readStream.pipe(res);
cors 代码:-
const cors = require("cors");
app.use(cors({
origin: "http://localhost:8081",
credentials: true,
withCredentials: true
}))
前端代码:-
fetch("http://localhost:8080/downloadNow",{
method:"POST",
headers:{
"Content-Type":"application/json"
},
body:JSON.stringify({
chatId:chatId
}),
credentials:"include"
})
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err);
})
前端响应:- 我从服务器成功响应,但文件未下载。
请帮我解决这个问题
试试这个
服务器
let mime = {
html: 'text/html',
txt: 'text/plain',
css: 'text/css',
gif: 'image/gif',
jpg: 'image/jpeg',
png: 'image/png',
svg: 'image/svg+xml',
js: 'application/javascript'
};
app.post('/imageDownload', async(req, res) => {
var type = mime[path.extname(req.body.imagePath).slice(1)] ||
'text/plain';
var s = fs.createReadStream(file);
s.on('open', function () {
res.set('Content-Type', type);
s.pipe(res);
});
s.on('error', function (err) {
console.log(err)
res.send(err)
});
}
客户
fetch(`/imageDownload`,{
method: 'POST',
headers:{
"Content-Type":"application/json"
},
body:JSON.stringify({
imagePath:url
}),
}).then(response => response.blob())
.then(function(myBlob) {
const url = window.URL.createObjectURL(new Blob([myBlob]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', "filename.jpg");
document.body.appendChild(link);
link.click();
})
这是所有处理下载的服务器代码吗?如果是,则您没有等待 readStream
正确打开。当无法打开 readStream 时,您还应该添加适当的错误处理。使用
let readStream = fs.createReadStream(path.join(__dirname, "..", chatDoc.chatContent));
readStream.on("open", () => {
res.setHeader("Content-Type","image/png")
res.setHeader("Content-Disposition", `inline; filename=${filename}`);
readStream.pipe(res);
})
readStream.on("error", e => {
console.log(e);
res.writeHead(400);
});
并使用 fetch
下载文件(在我的理解中,这意味着将文件保存到磁盘而不是在浏览器中显示)您仍然需要应用