Nodejs 上传图片原始路径的问题
Nodejs 上传图片原始路径的问题
之前做上传的时候碰到过问题,然后用了**var mult=require(‘connect-multiparty’);**这个模块修改了默认的上传路径, app.use(mult({ uploadDir: __dirname+’/temp’ })); 然后后端获取到的路径是/temp/…下的文件,也就是获取到的文件路径实际上是文件上传到服务器以后的路径, 打个比方: d://test/a.jpg 上传以后的路径是/temp/a.jpg 那我获取到的路径是/temp/a.jpg, 我现在还想获取原始路径, 即d://test/a.jpg 怎么搞,怎么搞?
自己顶一个~
当然可以。根据你的描述,你使用了 connect-multiparty
模块来处理文件上传,并且已经成功将文件上传到了指定目录(例如 /temp
)。然而,你希望同时保留并获取文件的原始路径。
解决方案
为了实现这一目标,你需要在文件上传时保存原始路径信息。这可以通过在前端或后端保存原始路径信息来实现。以下是一个简单的示例,展示如何在后端保存原始路径信息。
示例代码
- 安装必要的依赖
npm install express body-parser connect-multiparty
- 后端代码
const express = require('express');
const bodyParser = require('body-parser');
const multiparty = require('connect-multiparty');
const app = express();
const multipartMiddleware = multiparty();
// 用于存储文件的原始路径
const uploadedFiles = {};
// 中间件,解析请求体
app.use(bodyParser.urlencoded({ extended: false }));
// 文件上传路由
app.post('/upload', multipartMiddleware, (req, res) => {
const files = req.files;
const originalPath = req.body.originalPath;
if (!originalPath || !files.file) {
return res.status(400).send('缺少必要参数');
}
const tempFilePath = files.file.path;
uploadedFiles[tempFilePath] = originalPath;
res.send({
message: '文件上传成功',
tempFilePath,
originalPath
});
});
// 查询文件原始路径
app.get('/getOriginalPath', (req, res) => {
const tempFilePath = req.query.tempFilePath;
if (!tempFilePath) {
return res.status(400).send('缺少必要参数');
}
const originalPath = uploadedFiles[tempFilePath];
if (!originalPath) {
return res.status(404).send('未找到对应的原始路径');
}
res.send({
tempFilePath,
originalPath
});
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 中间件:我们使用
connect-multiparty
来处理文件上传。 - 保存原始路径:在文件上传时,我们将原始路径信息保存在一个对象
uploadedFiles
中,键为临时文件路径,值为原始路径。 - 查询原始路径:通过一个 GET 请求,你可以查询某个临时文件路径对应的原始路径。
前端示例
前端需要传递原始路径给后端,这里是一个简单的 HTML 表单示例:
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="text" name="originalPath" value="d://test/a.jpg" />
<button type="submit">上传</button>
</form>
<button onclick="getOriginalPath()">查询原始路径</button>
<script>
function getOriginalPath() {
const tempFilePath = '/temp/a.jpg'; // 从后端获取的临时文件路径
fetch(`/getOriginalPath?tempFilePath=${encodeURIComponent(tempFilePath)}`)
.then(response => response.json())
.then(data => {
console.log('原始路径:', data.originalPath);
})
.catch(error => console.error('Error:', error));
}
</script>
通过这种方式,你可以在文件上传后获取并保存原始路径信息,从而方便地查询文件的原始路径。
app.js app.locals.prjpath=__dirname; 后面再取出来,或者存储图片时直接用__dirname替换掉最后几个文件夹试试
uploadDir指定你想要的文件夹,然后rename成原来的文件名应该可行;只不过request是不是记录了上传的源文件位置就不得而知了
要获取上传文件的原始路径(例如 d://test/a.jpg
),你需要在客户端上传文件时将原始路径一同发送给服务器。通常情况下,浏览器不会自动上传原始路径信息,因为这涉及到了用户文件系统的隐私安全。
你可以通过以下几种方式解决这个问题:
-
客户端额外提交原始路径信息:当用户选择文件时,可以通过JavaScript获取文件的原始路径,并将其与文件一起提交给服务器。但请注意,由于同源策略限制,浏览器可能不允许直接访问文件的原始路径,特别是对于跨域请求。
-
使用FormData对象:通过FormData对象来传输文件和相关信息(包括原始路径)。以下是一个简单的示例代码:
// 客户端
document.getElementById('fileInput').addEventListener('change', function(event) {
var file = event.target.files[0];
var formData = new FormData();
formData.append('file', file);
formData.append('originalPath', file.path); // 假设file对象有一个path属性
fetch('/upload', {
method: 'POST',
body: formData
});
});
// 服务器端 (Express + connect-multiparty)
const express = require('express');
const multipart = require('connect-multiparty');
const multipartMiddleware = multipart();
const app = express();
app.post('/upload', multipartMiddleware, (req, res) => {
const originalPath = req.body.originalPath; // 获取原始路径
const tempFilePath = req.files.file.path; // 获取临时文件路径
console.log('Original Path:', originalPath);
console.log('Temporary File Path:', tempFilePath);
// 进行后续处理
res.send('File received');
});
app.listen(3000, () => console.log('Server running on port 3000'));
请注意,上述代码中的 file.path
是假设性的,实际文件对象可能不包含此属性。你需要根据实际情况调整代码。
- 存储原始路径:如果你需要频繁地上传同一文件夹下的文件,可以考虑将原始路径存储在数据库或本地缓存中,在需要时进行检索。
总之,直接从文件对象获取原始路径较为复杂且受限于浏览器安全策略,最好的方法是在上传时通过其他途径传递原始路径信息。