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 怎么搞,怎么搞?


5 回复

自己顶一个~


当然可以。根据你的描述,你使用了 connect-multiparty 模块来处理文件上传,并且已经成功将文件上传到了指定目录(例如 /temp)。然而,你希望同时保留并获取文件的原始路径。

解决方案

为了实现这一目标,你需要在文件上传时保存原始路径信息。这可以通过在前端或后端保存原始路径信息来实现。以下是一个简单的示例,展示如何在后端保存原始路径信息。

示例代码

  1. 安装必要的依赖
npm install express body-parser connect-multiparty
  1. 后端代码
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');
});

解释

  1. 中间件:我们使用 connect-multiparty 来处理文件上传。
  2. 保存原始路径:在文件上传时,我们将原始路径信息保存在一个对象 uploadedFiles 中,键为临时文件路径,值为原始路径。
  3. 查询原始路径:通过一个 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),你需要在客户端上传文件时将原始路径一同发送给服务器。通常情况下,浏览器不会自动上传原始路径信息,因为这涉及到了用户文件系统的隐私安全。

你可以通过以下几种方式解决这个问题:

  1. 客户端额外提交原始路径信息:当用户选择文件时,可以通过JavaScript获取文件的原始路径,并将其与文件一起提交给服务器。但请注意,由于同源策略限制,浏览器可能不允许直接访问文件的原始路径,特别是对于跨域请求。

  2. 使用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 是假设性的,实际文件对象可能不包含此属性。你需要根据实际情况调整代码。

  1. 存储原始路径:如果你需要频繁地上传同一文件夹下的文件,可以考虑将原始路径存储在数据库或本地缓存中,在需要时进行检索。

总之,直接从文件对象获取原始路径较为复杂且受限于浏览器安全策略,最好的方法是在上传时通过其他途径传递原始路径信息。

回到顶部