Javascript - Como extrair nome do arquivo a partir de um controle de entrada de arquivo
-
21-08-2019 - |
Pergunta
Quando um usuário seleciona um arquivo em uma página da web que eu quero ser capaz de extrair apenas o nome do arquivo.
Eu tentei função str.search mas parece falhar quando o nome do arquivo é algo como isto: c:. \ Uploads \ ilike.this.file.jpg
Como podemos extrair apenas o nome do arquivo sem extensão?
Solução
Assumindo que o seu tem um id de Enviar isso deve esperamos fazer o truque:
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);
}
Outras dicas
Para dividir a string ({filepath} / {filename}) e obter o nome do arquivo que você poderia usar algo como isto:
str.split(/(\\|\/)/g).pop()
"O método pop remove o último elemento de uma matriz e retorna esse valor para o chamador ". Mozilla Developer Network
Exemplo:
De: "/home/user/file.txt".split(/(\\|\/)/g).pop()
você obtém: "file.txt"
Hoje em dia há uma maneira muito mais simples:
var fileInput = document.getElementById('upload');
var filename = fileInput.files[0].name;
Muito simples
let file = $("#fileupload")[0].files[0];
file.name
Assumindo:
<input type="file" name="file1" id="theFile">
O JavaScript seria:
var fileName = document.getElementById('theFile').files[0].name;
var pieces = str.split('\\');
var filename = pieces[pieces.length-1];
Eu só fiz a minha própria versão deste. Minha função pode ser usada para extrair o que quiser com ele, se você não precisa de tudo isso, então você pode facilmente remover algum código.
<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>
saída será o seguinte:
- arquivo com nome 'TestCase1' tem extensão: 'jpeg' é no diretório: 'C: \ blabla \ blaeobuaeu'
- arquivo com nome 'testcase2' tem extensão: 'png' é no diretório: / tmp / blabla '
- arquivo com nome 'testcase3' tem extensão: 'htm' é no diretório: ''
- Diretório com o nome 'Testcase4' tem extensão: '' é no diretório: 'C:'
- Diretório com o nome fileWithoutDots 'tem extensão: '' é no diretório: '/dir.with.dots'
- Diretório com o nome '' tem extensão: '' é no diretório: '/dir.with.dots/another.dir'
Com && nOffset+1 === str.length
adicionado ao isDirectory
:
- arquivo com nome 'TestCase1' tem extensão: 'jpeg' é no diretório: 'C: \ blabla \ blaeobuaeu'
- arquivo com nome 'testcase2' tem extensão: 'png' é no diretório: / tmp / blabla '
- arquivo com nome 'testcase3' tem extensão: 'htm' é no diretório: ''
- Diretório com o nome 'Testcase4' tem extensão: '' é no diretório: 'C:'
- Diretório com o nome fileWithoutDots 'tem extensão: '' é no diretório: '/dir.with.dots'
- Diretório com o nome '' tem extensão: '' é no diretório: '/dir.with.dots/another.dir'
Tendo em conta os casos de teste que você pode ver esta função funciona muito robusta em comparação com os outros métodos aqui proposto.
Nota para iniciantes sobre o \\: \ é um caractere de escape, por exemplo \ n significa uma nova linha e \ t uma guia. Para torná-lo possível escrever \ n, você deve realmente digitar \\ n.
Eu suponho que você quer retirar todas as extensões, ou seja /tmp/test/somefile.tar.gz
para somefile
.
abordagem direta com o regex:
var filename = filepath.match(/^.*?([^\\/.]*)[^\\/]*$/)[1];
abordagem alternativa com operação regex e array:
var filename = filepath.split(/[\\/]/g).pop().split('.')[0];
Input : C:\path\Filename.ext
saída : Filename
código Em HTML, defina o valor onChange
arquivo como este ...
<input type="file" name="formdata" id="formdata" onchange="setfilename(this.value)"/>
Assumindo que o seu ID de campo de texto é '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>
Nenhuma das respostas altamente upvoted realmente fornecer "apenas o nome do arquivo sem extensão" e as outras soluções são maneira muito código para um trabalho tão simples.
Eu acho que isso deve ser um one-liner para qualquer programador JavaScript. É uma expressão regular muito simples:
function basename(prevname) {
return prevname.replace(/^(.*[/\\])?/, '').replace(/(\.[^.]*)$/, '');
}
Primeiro, tira qualquer coisa até a última barra, se presente.
Em seguida, tira nada depois do último período, se presente.
É simples, é robusto, ele implementa exatamente o que está pediu. Estou faltando alguma coisa?
// 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
}
Nenhuma das respostas acima funcionou para mim, aqui é a minha solução que atualiza uma entrada desativada com o nome do arquivo:
<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>
Se você estiver usando jQuery, em seguida,
$("#fileupload").val();