如何在 node.js 中安全地将本地文件路径转换为文件::?/ url?

问题描述 投票:0回答:4

我有本地文件路径(在 node.js 中),我需要将它们转换成

file://
urls.

我现在正在查看 https://en.wikipedia.org/wiki/File_URI_scheme 我觉得这一定是一个已解决的问题,并且必须有人有一个片段或 npm 模块来做到这一点。

但后来我尝试在 npm 上搜索这个,但我得到了很多麻烦,这并不好笑(文件、url 和路径是搜索命中,就像每个包一样:) 与谷歌和 SO 相同。

我可以做这种天真的方法

site = path.resolve(site);
if (path.sep === '\\') {
    site = site.split(path.sep).join('/');
}
if (!/^file:\/\//g.test(site)) {
    site = 'file:///' + site;
}

但我很确定那不是要走的路。

javascript node.js url npm
4个回答
54
投票

Node.js v10.12.0 刚刚有两个新方法来解决这个问题:

const url = require('url');
url.fileURLToPath(url)
url.pathToFileURL(path)

文档


25
投票

使用

file-url
模块.

npm install --save file-url

用法:

var fileUrl = require('file-url');

fileUrl('unicorn.jpg');
//=> file:///Users/sindresorhus/dev/file-url/unicorn.jpg 

fileUrl('/Users/pony/pics/unicorn.jpg');
//=> file:///Users/pony/pics/unicorn.jpg

也适用于 Windows。代码非常简单,以防你只想摘录一段:

var path = require('path');

function fileUrl(str) {
    if (typeof str !== 'string') {
        throw new Error('Expected a string');
    }

    var pathName = path.resolve(str).replace(/\\/g, '/');

    // Windows drive letter must be prefixed with a slash
    if (pathName[0] !== '/') {
        pathName = '/' + pathName;
    }

    return encodeURI('file://' + pathName);
};

4
投票

我有一个类似的issue,但解决方案最终是使用新的

WHATWG URL
实现:

const path = 'c:\\Users\\myname\\test.swf';
const u = new URL(`file:///${path}`).href;
// u = 'file:///c:/Users/myname/test.swf'

0
投票

说明: 这是将路径转换为文件的解决方案。通过使用以下方法,您必须在 fetch 中加载路径,然后文件将作为 blob 加载。然后使用 blob 创建一个文件对象。

fetch(src)
  .then(res => res.blob())
  .then(blob => {
    const file = new File([blob], 'fileName', { type: "image/png" })
    
  })
© www.soinside.com 2019 - 2024. All rights reserved.