【发布时间】:2010-10-25 20:24:20
【问题描述】:
当用户在网页中选择文件时,我希望能够仅提取文件名。
我确实尝试了 str.search 功能,但是当文件名如下时它似乎失败了:c:\uploads\ilike.this.file.jpg。
我们怎样才能只提取没有扩展名的文件名?
【问题讨论】:
标签: javascript browser extract
当用户在网页中选择文件时,我希望能够仅提取文件名。
我确实尝试了 str.search 功能,但是当文件名如下时它似乎失败了:c:\uploads\ilike.this.file.jpg。
我们怎样才能只提取没有扩展名的文件名?
【问题讨论】:
标签: javascript browser extract
var pieces = str.split('\\');
var filename = pieces[pieces.length-1];
【讨论】:
假设您的 的 id 为 upload,这应该可以解决问题:
var fullPath = document.getElementById('upload').value;
if (fullPath) {
var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/'));
var filename = fullPath.substring(startIndex);
if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) {
filename = filename.substring(1);
}
alert(filename);
}
【讨论】:
filename = filename.substring(0, filename.lastIndexOf('.')); 因为他的方式将失败,因为扩展名超过 3 个字符,因此:.html、.jpeg 等。
var startIndex = Math.max(fullPath.lastIndexOf('\\'), fullPath.lastIndexOf('/')) + 1;
要拆分字符串 ({filepath}/{filename}) 并获取文件名,您可以使用以下内容:
str.split(/(\\|\/)/g).pop()
"pop 方法从数组中删除最后一个元素并返回 对调用者的价值。”
Mozilla Developer Network
例子:
来自:"/home/user/file.txt".split(/(\\|\/)/g).pop()
你得到:"file.txt"
【讨论】:
var filename = filepath.replace(/^.*?([^\\\/]*)$/, '$1');
[\\/]。此外,它也被要求剥离文件扩展名。如需完整的解决方案,请参阅:stackoverflow.com/a/32156800/19163
我刚刚制作了自己的版本。我的函数可以用来提取你想要的任何东西,如果你不需要全部,那么你可以很容易地删除一些代码。
<html>
<body>
<script type="text/javascript">
// Useful function to separate path name and extension from full path string
function pathToFile(str)
{
var nOffset = Math.max(0, Math.max(str.lastIndexOf('\\'), str.lastIndexOf('/')));
var eOffset = str.lastIndexOf('.');
if(eOffset < 0 && eOffset < nOffset)
{
eOffset = str.length;
}
return {isDirectory: eOffset === str.length, // Optionally: && nOffset+1 === str.length if trailing slash means dir, and otherwise always file
path: str.substring(0, nOffset),
name: str.substring(nOffset > 0 ? nOffset + 1 : nOffset, eOffset),
extension: str.substring(eOffset > 0 ? eOffset + 1 : eOffset, str.length)};
}
// Testing the function
var testcases = [
"C:\\blabla\\blaeobuaeu\\testcase1.jpeg",
"/tmp/blabla/testcase2.png",
"testcase3.htm",
"C:\\Testcase4", "/dir.with.dots/fileWithoutDots",
"/dir.with.dots/another.dir/"
];
for(var i=0;i<testcases.length;i++)
{
var file = pathToFile(testcases[i]);
document.write("- " + (file.isDirectory ? "Directory" : "File") + " with name '" + file.name + "' has extension: '" + file.extension + "' is in directory: '" + file.path + "'<br />");
}
</script>
</body>
</html>
将输出以下内容:
将&& nOffset+1 === str.length 添加到isDirectory:
鉴于测试用例,您可以看到与此处提出的其他方法相比,此函数的工作非常稳健。
关于 \\ 的新手注意事项:\ 是转义字符,例如 \n 表示换行符,\t 表示制表符。为了能够写 \n,您必须实际输入 \\n。
【讨论】:
&& eOffset < nOffset)。
我假设您想删除所有扩展名,即 /tmp/test/somefile.tar.gz 到 somefile。
使用正则表达式的直接方法:
var filename = filepath.match(/^.*?([^\\/.]*)[^\\/]*$/)[1];
正则表达式和数组操作的替代方法:
var filename = filepath.split(/[\\/]/g).pop().split('.')[0];
【讨论】:
没有一个得到高度评价的答案实际上提供了“只是没有扩展名的文件名”,而其他解决方案对于这样一个简单的工作来说代码太多了。
我认为这对任何 JavaScript 程序员来说都应该是一个单行字。这是一个非常简单的正则表达式:
function basename(prevname) {
return prevname.replace(/^(.*[/\\])?/, '').replace(/(\.[^.]*)$/, '');
}
首先,删除任何内容,直到最后一个斜线(如果存在)。
然后,删除最后一个句号之后的任何内容(如果存在)。
它很简单,它很健壮,它完全实现了所要求的。我错过了什么吗?
【讨论】:
现在有一个更简单的方法:
var fileInput = document.getElementById('upload');
var filename = fileInput.files[0].name;
【讨论】:
.name之前检查fileInput.files.length,以防用户点击取消。
很简单
let file = $("#fileupload")[0].files[0];
file.name
【讨论】:
输入:C:\path\Filename.ext
输出:Filename
在 HTML 代码中,像这样设置 File onChange 值...
<input type="file" name="formdata" id="formdata" onchange="setfilename(this.value)"/>
假设您的文本字段 id 是 'wpName'...
<input type="text" name="wpName" id="wpName">
JavaScript
<script>
function setfilename(val)
{
filename = val.split('\\').pop().split('/').pop();
filename = filename.substring(0, filename.lastIndexOf('.'));
document.getElementById('wpName').value = filename;
}
</script>
【讨论】:
以上答案都不适合我,这是我的解决方案,它使用文件名更新禁用的输入:
<script type="text/javascript">
document.getElementById('img_name').onchange = function () {
var filePath = this.value;
if (filePath) {
var fileName = filePath.replace(/^.*?([^\\\/]*)$/, '$1');
document.getElementById('img_name_input').value = fileName;
}
};
</script>
【讨论】:
如果你使用的是 jQuery,那么
$("#fileupload").val();
【讨论】:
// HTML
<input type="file" onchange="getFileName(this)">
// JS
function getFileName(input) {
console.log(input.files[0].name) // With extension
console.log(input.files[0].name.replace(/\.[^/.]+$/, '')) // Without extension
}
【讨论】:
假设:
<input type="file" name="file1" id="theFile">
JavaScript 将是:
var fileName = document.getElementById('theFile').files[0].name;
【讨论】:
var path = document.getElementById('upload').value;//take path
var tokens= path.split('\\');//split path
var filename = tokens[tokens.length-1];//take file name
【讨论】:
//x=address or src
if(x.includes('/')==true){xp=x.split('/')} //split address
if(x.includes('\\')==true){xp=x.split('\\')} //split address
xl=xp.length*1-1;xn=xp[xl] //file==xn
xo=xn.split('.'); //file parts=xo
if(xo.lenght>2){xol=xo.length-1;xt=xo[xol];xr=xo.splice(xol,1);
xr=xr.join('.'); // multiple . in name
}else{
xr=xo[0]; //filename=xr
xt=xo[1]; //file ext=xt
}
xp.splice(xl,1); //remove file
xf=xp.join('/'); //folder=xf , also corrects slashes
//result
alert("filepath: "+x+"\n folder: "+xf+"("+xl+")\n file: "+xn+"\n filename: "+xr+"\n .ext: "+xt)
【讨论】: