[英]Uploading File to FTP Server with node.js requires full directory path to file which isn't available
我是 js/reactjs/nodejs 的新手,我正在实现一项功能,允许用户手动选择文件并将其上传到
test local ftp server
(在目录/test)
。 我遇到的问题是ftp.upload
函数需要一个String
作为上传文件的完整路径,但我没有明确给出路径,因为该文件是通过“浏览文件”按钮选择的。如果我在没有 ftp(本地)的情况下进行测试,它可以完美运行,但我似乎无法将请求中的文件上传到 FTP 服务器。 如果我向要上传的文件添加完整路径,它似乎可以工作,但这会破坏
choosing a file to upload and uploading after clicking on Upload
的目的
这是 server.js
const express = require("express");
const fileUpload = require("express-fileupload");
const app = express();
var EasyFtp = require("easy-ftp");
var ftp = new EasyFtp();
app.use(fileUpload());
var config = {
host: "127.0.0.1",
type: "FTP",
port: "",
username: "admin",
password: "",
};
ftp.connect(config);
app.post("/upload", (req, res) => {
console.log(req.files);
if (req.files === null) {
return res.status(400).json({ msg: "No file was uploaded" }); //no file uploaded
}
const file = req.files.file;
ftp.upload(file, "/test", function (err) {
if (err) {
console.log(err);
return res.status(500).send(err);
} else {
console.log("finished:", res);
res.json({ fileName: file.name, filePath: `/upload/${file.name}` });
}
});
// res.json({ fileName: file.name, filePath: `/uploads/${file.name}` });
});
ftp.mv(
`/test/(${
(file.tempFilePath.split("/").at(-1),
file.name,
function (err, newPath) {})
})`
);
ftp.close();
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`server started on port ${PORT}`));
这是文件上传文件
import React, { Fragment, useState } from "react";
import axios from "axios";
import Message from "./Message";
import Progress from "./Progress";
const FileUpload = () => {
//actual file and filename should go into state because the label "Choose File" needs to be replaced with the actual filename
const [files, setFile] = useState("");
const [filename, setFilename] = useState("Choose File...");
const [uploadedFiles, setUploadedFiles] = useState({});
const [message, setMessage] = useState("");
const [uploadPercent, setUploadPercent] = useState(0);
const onChange = (e) => {
setFile(e.target.files[0]);
let x = [];
for (let file of e.target.files) {
x.push(file.name);
}
setFilename(x);
};
const onSubmit = async (e) => {
e.preventDefault();
//add the file to form data
const formData = new FormData();
formData.append("file", files);
try {
const response = await axios.post("/upload", formData, {
headers: {
"Content-Type": "multipart/form-data",
},
//progress bar for upload
onUploadProgress: (progressEvent) => {
setUploadPercent(
parseInt(
//get rid of progress bar after 10 seconds of finished upload
Math.round((progressEvent.loaded * 100) / progressEvent.total)
)
);
setTimeout(() => setUploadPercent(0), 1000);
},
//clear loaded percentage bar
});
const { fileName, filePath } = response.data;
setUploadedFiles({ fileName, filePath });
setMessage("File uploaded successfully");
} catch (error) {
if (error.response.status === 500) {
setMessage("There was a problem with the server, please try again.");
} else {
setMessage(error.response.data.msg);
}
}
};
return (
<Fragment>
{message ? <Message msg={message} /> : null}
<form onSubmit={onSubmit}>
<div className="custom-file">
<input
type="file"
className="custom-file-input"
id="customFile"
onChange={onChange}
multiple
/>
<label className="custom-file-label" htmlFor="customFile">
{filename}
</label>
</div>
<Progress percentage={uploadPercent} />
<input
type="submit"
value="Upload"
className="btn btn-primary btn-block mt-4"
/>
</form>
</Fragment>
);
};
export default FileUpload;
有什么办法可以纠正这个吗? 我错过了什么? 如果需要更多代码片段,请告诉我!
ftp.mv 什么也没做
app.post("/upload", (req, res) => {
console.log(req.files);
if (req.files === null) {
return res.status(400).json({ msg: "No file was uploaded" }); //error message if no file was uploaded
}
const file = req.files.file;
const tempFileName = file.tempFilePath.split("/").at(-1);
ftp.upload(file.tempFilePath, "/test", function (err) {
if (err) {
console.log(err);
return res.status(500).send(err);
} else {
console.log("finished:", res);
res.json({
fileName: file.name,
filePath: `/uploads/${file.name}`,
});
}
});
ftp.mv(`/test/${tempFileName}`, "abc", function (err, newPath) {});
ftp.close();
});
您正在向服务器发送文件,您需要暂时保存并从那里上传,首先将您的 fileUpload 配置更改为:
app.use(fileUpload({
useTempFiles : true,
tempFileDir : '/tmp/'
}));
然后您可以通过访问其临时文件路径来上传文件:
app.post("/upload", (req, res) => {
console.log(req.files);
if (req.files === null) {
return res.status(400).json({ msg: "No file was uploaded" }); //no file uploaded
}
const file = req.files.file;
// here we access the temporary file path
ftp.upload(file.tempFilePath, "/test", function (err) {
if (err) {
console.log(err);
return res.status(500).send(err);
} else {
console.log("finished:", res);
res.json({ fileName: file.name, filePath: `/upload/${file.name}` });
}
ftp.close();
});
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.