Javascript-파일 입력 컨트롤에서 파일 이름을 추출하는 방법


117

사용자가 웹 페이지에서 파일을 선택할 때 파일 이름 만 추출 할 수 있기를 원합니다.

str.search 함수를 시도했지만 파일 이름이 c : \ uploads \ ilike.this.file.jpg 와 같은 경우 실패한 것 같습니다 .

확장자없이 파일 이름 만 추출하려면 어떻게해야합니까?

답변:


127

<input type = "file">업로드 ID가 있다고 가정하면 다음과 같이 트릭을 수행 할 수 있습니다.

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);
}

감사합니다 이것은 잘 작동하는 것 같지만 확장자가없는 파일 이름을 원합니다. 위의 코드에서 어떻게 할 수 있습니까?
Yogi Yang 007

확장자없이 파일 이름 만 추출하기 위해 다음 두 줄의 코드를 추가했습니다. "filename = filename.substring (0, filename.length-4); filename = filename.toLowerCase ();"
Yogi Yang 007

13
아니요, 양요 기가 말하는 방식으로하고 싶지는 않습니다. 대신 사용 : filename = filename.substring(0, filename.lastIndexOf('.'));3 자 이상의 문자 확장으로 실패하므로 .html, .jpeg 등.
Yeti

1
여러 파일을 선택한 경우 파일 이름을 얻는 방법은 무엇입니까?
avngr

왜 그렇게 startIndex를 계산하지 않습니까? var startIndex = Math.max(fullPath.lastIndexOf('\\'), fullPath.lastIndexOf('/')) + 1;
nollidge

196

문자열 ({filepath} / {filename})을 분할하고 파일 이름을 얻으려면 다음과 같이 사용할 수 있습니다.

str.split(/(\\|\/)/g).pop()

"pop 메서드는 배열에서 마지막 요소를 제거하고 해당 값을 호출자에게 반환합니다."
Mozilla 개발자 네트워크

예:

에서: "/home/user/file.txt".split(/(\\|\/)/g).pop()

당신은 얻는다 : "file.txt"


5
var filename = filepath.replace(/^.*?([^\\\/]*)$/, '$1');
정규식

1
vog의 ​​답변은 질문에 대한 100 % 정확한 답변에 매우 가깝습니다 (확장자를 제거해야하는 경우 제외). 파일 이름은 다른 문자열과 다르지 않습니다.
Jon Watte

1
분할 정규식은 [\\/]. 또한 파일 확장자도 제거하라는 요청을 받았습니다. 전체 솔루션은 다음을 참조하십시오. stackoverflow.com/a/32156800/19163
vog

간결한 멀티 플랫폼. 큰.
Marc

훌륭한 솔루션, 나는 그것이 어떻게 작동하는지 이해하지 못하며 그것이 더 좋아하는 이유입니다!
Chatoxz

92

요즘에는 훨씬 더 간단한 방법이 있습니다.

var fileInput = document.getElementById('upload');   
var filename = fileInput.files[0].name;

5
사용자가 취소를 클릭 한 경우 fileInput.files.length호출하기 전에 확인하십시오 .name.
marcovtwout

29

아주 간단

let file = $("#fileupload")[0].files[0]; 
file.name

TypeScript를 사용하는 경우 $ ( "# fileupload") [0] [ "files"] [0];
Morvael

18

가정 :

<input type="file" name="file1" id="theFile">

JavaScript는 다음과 같습니다.

var fileName = document.getElementById('theFile').files[0].name;

8
var pieces = str.split('\\');
var filename = pieces[pieces.length-1];

이것은 사용자가 Windows를 실행하고 있다고 가정합니다. 다른 운영 체제는 다른 파일 경로 구분자를 사용합니다.
Quentin

Windows가 아닌 사용자의 경우에도 '/'문자를 확인해야합니까? 예를 들어 if (! pieces) {str.split ( '/'); }? +1하지만 좋은 간단한 솔루션
Ian Oxley

IIRC, IE는 어쨌든 파일의 전체 경로를 제공하는 유일한 브라우저입니다 ... Firefox와 같은 다른 브라우저에서 분할 할 필요가 없으므로 여전히 작동합니다. 비록 나는 모든 리눅스 / 유닉스 브라우저를 시도하지 않았다는 것을 인정하지만.
TM.

6
str.split (/ (\\ | \ /) / g); Windows 및 * nix 용
Tracker1

@TM. Chrome은 추악한 안전을 위해 가짜 경로 변수를 사용합니다. iirc 사용중인 OS에 따라 다릅니다.
lededje 2013 년

5

난 당신이, 즉 모든 확장을 제거하려는 가정 /tmp/test/somefile.tar.gzsomefile .

정규식을 사용한 직접적인 접근 :

var filename = filepath.match(/^.*?([^\\/.]*)[^\\/]*$/)[1];

정규식 및 배열 작업을 사용한 대체 방법 :

var filename = filepath.split(/[\\/]/g).pop().split('.')[0];

1
요청한대로 확장 프로그램을 제거하지 않습니다.
Jon Watte

결정된. 힌트 주셔서 감사합니다!
vog

4

나는 이것의 내 자신의 버전을 만들었습니다. 내 함수를 사용하여 원하는 것을 추출 할 수 있습니다. 모든 것이 필요하지 않은 경우 일부 코드를 쉽게 제거 할 수 있습니다.

<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>

다음을 출력합니다.

  • 이름이 'testcase1'인 파일의 확장자는 'jpeg'가 'C : \ blabla \ blaeobuaeu'입니다.
  • 이름이 'testcase2'인 파일의 확장자는 'png'가 '/ tmp / blabla'디렉토리에 있습니다.
  • 이름이 'testcase3'인 파일의 확장자는 'htm'이 다음 디렉토리에 있습니다. ''
  • 이름이 'Testcase4'인 디렉토리의 확장자가 ''입니다. 디렉토리가 'C :'입니다.
  • 이름이 'fileWithoutDots'인 디렉토리의 확장자는 ''입니다. 디렉토리는 '/dir.with.dots'입니다.
  • 이름이 ''인 디렉토리의 확장자가 ''인 디렉토리가 '/dir.with.dots/another.dir'디렉토리에 있습니다.

&& nOffset+1 === str.length추가 isDirectory:

  • 이름이 'testcase1'인 파일의 확장자는 'jpeg'가 'C : \ blabla \ blaeobuaeu'입니다.
  • 이름이 'testcase2'인 파일의 확장자는 'png'가 '/ tmp / blabla'디렉토리에 있습니다.
  • 이름이 'testcase3'인 파일의 확장자는 'htm'이 다음 디렉토리에 있습니다. ''
  • 이름이 'Testcase4'인 디렉토리의 확장자가 ''입니다. 디렉토리가 'C :'입니다.
  • 이름이 'fileWithoutDots'인 디렉토리의 확장자는 ''입니다. 디렉토리는 '/dir.with.dots'입니다.
  • 이름이 ''인 디렉토리의 확장자가 ''인 디렉토리가 '/dir.with.dots/another.dir'디렉토리에 있습니다.

테스트 케이스가 주어지면이 기능이 여기에서 제안 된 다른 방법에 비해 상당히 강력하게 작동하는 것을 볼 수 있습니다.

초보자를위한 참고 사항 \\ : \는 이스케이프 문자입니다. 예를 들어 \ n은 개행 문자와 \ ta 탭을 의미합니다. 쓰기를 가능하게하려면 \ n 실제로 \\ n을 입력해야합니다.


1
이 경로를 확인하십시오 : dir.with.dots / fileWithoutDots nOffset보다 작은 eOffset을 얻고 추출 표현식을 혼동 할 수 있습니다.
Jesse Chisholm

예, 고쳤습니다. 이제 제대로 작동합니다 (추가됨 && eOffset < nOffset).
Yeti

2

입력 : 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">

자바 스크립트

<script>
  function setfilename(val)
  {
    filename = val.split('\\').pop().split('/').pop();
    filename = filename.substring(0, filename.lastIndexOf('.'));
    document.getElementById('wpName').value = filename;
  }
</script>

1

높게 찬성 된 답변 중 어느 것도 실제로 "확장자가없는 파일 이름"을 제공하지 않으며 다른 솔루션은 이러한 간단한 작업에 너무 많은 코드입니다.

저는 이것이 모든 자바 스크립트 프로그래머에게 한 줄짜리가되어야한다고 생각합니다. 매우 간단한 정규식입니다.

function basename(prevname) {
    return prevname.replace(/^(.*[/\\])?/, '').replace(/(\.[^.]*)$/, '');
}

먼저, 마지막 슬래시까지 제거하십시오 (있는 경우).

그런 다음 마지막 기간 이후에있는 경우 제거합니다.

간단하고 견고하며 요청한 것을 정확히 구현합니다. 내가 뭔가를 놓치고 있습니까?


1
"매우 간단한 정규식"... 사실 이것들은 두 개의 정규식입니다. :-) 단일 정규식 솔루션에 대한 내 대답을 참조하십시오.
vog

예, 파이프 (|) 연산자를 사용하여이 두 정규식을 단일 정규식으로 압축하기위한 명백한 재 작성도 있습니다. 작성된 코드가 더 명확하다고 생각하지만 문자열이 두 번 실행되므로 문자열이 일반적으로 꽤 길면 문제가 될 것입니다. (파일의 경로는 일반적으로하지 않지만이 될 수 있습니다.)
존 Watte

1
난 그냥 멍청이 였어. 그것을 심각하게 받아들이지 마십시오. 최적화 할 필요가 없으며 제안 된 모든 솔루션이 충분히 빠릅니다. 매우 긴 파일 경로는 여전히 기가 바이트가 아니라 킬로바이트입니다. 그리고이 기능은 일괄 적으로 1000x가 아니라 파일 업로드 당 한 번 트리거됩니다. 여기서 중요한 것은 코드의 정확성과 명확성뿐입니다.
vog

1
// 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
}

확장 프로그램을 제거하는 방법


1
이것은 "확장자없이 파일 이름 만 추출"이라는 질문의 중요한 부분을 놓친다. 질문에 답하기 전에 먼저 질문을주의 깊게 읽으면 도움이됩니다.
zeh

1
var path = document.getElementById('upload').value;//take path
var tokens= path.split('\\');//split path
var filename = tokens[tokens.length-1];//take file name

0

위의 답변 중 어느 것도 나를 위해 일하지 않았습니다. 여기에 파일 이름으로 비활성화 된 입력을 업데이트하는 솔루션이 있습니다.

<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>

-2

jQuery를 사용하는 경우

$("#fileupload").val();

val ()은 실제로 그가 원하지 않는 전체 파일 경로를 반환합니다.
FabricioG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.