Node.js,从URL解析文件名

45

我怎样解析一个URL?

site.com:8080/someFile.txt?attr=100
或者
site.com:8080/someFile.txt/?attr=100

我需要获取someFile.txt这个文件名是我自己设置的,格式可以是txt或其他。

更新

我尝试过

var path = url.parse(req.url).path;

但是我仍然无法获取路径(someFile.txt)。


1
你应该从一开始就提及所有细节。- http://nodejs.org/docs/latest/api/url.html - Cheery
2
你的意思是你需要获取 someFile.txt 吗? - falsetru
是的,它可以是服务器上的任何文件(例如 Kitty.jpgorder.json)。 - Aaron
这个URL的格式保证是这样的吗?它会有一个前导的http://吗? - Cory Danielson
不需要这样做。 - Aaron
显示剩余3条评论
4个回答

93

像这样的东西..

var url = require("url");
var path = require("path");
var parsed = url.parse("http://example.com:8080/test/someFile.txt/?attr=100");
console.log(path.basename(parsed.pathname));

我使用node.js服务器。并尝试在服务器端解析代码。 - Aaron
我刚刚做了,它是/test/someFile.txt/ - Toolkit
1
path.posix.basename会在Windows和Linux上返回文件名,而path.basename仅在Windows上返回文件名。https://nodejs.org/api/path.html#path_windows_vs_posix - James Sullivan
1
这将打印转义字符,应该是:console.log(decodeURIComponent(path.basename(parsed.pathname))); - Luke
'parse'的签名 '(urlString: string): UrlWithStringQuery' 已被弃用。 - Liam Pillay
1
@LiamPillay 这种方法已经过时了。请使用 new URL("url here") - Cheery

9

这是我的工作代码,希望能帮到您

import path from 'path'

const getBasenameFormUrl = (urlStr) => {
    const url = new URL(urlStr)
    return path.basename(url.pathname)
}

2
decodeURIComponent(path.basename('http://localhost/node-v18.12.1-x64.msi'))

node-v18.12.1-x64.msi

-1

您可以轻松使用Node.js的url模块来处理您的示例:

var URL = require('url').parse('site.com:8080/someFile.txt?attr=100');
console.log(URL.pathname.replace(/(^\/|\/$)/g,'')); // "someFile.txt"

然而,这在Node.js的URL示例中不起作用(因为它有更多的路径)。

通过从最右边的斜杠开始截断完整路径,它将产生文件名:

var URL = require('url').parse('http://user:pass@host.com:8080/p/a/t/h?query=string#hash');
console.log(URL.pathname.substring(URL.pathname.lastIndexOf('/')+1)); // "h"

如果这个想法被认为足够安全适用于设备,我们可以直接实现:

var file = url.substring(url.lastIndexOf('/')+1).replace(/((\?|#).*)?$/,'');
                              /* hashes and query strings ----^  */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接