Sử dụng jQuery để lấy tên tệp đã chọn của tệp nhập mà không có đường dẫn


153

Tôi đã sử dụng điều này:

$('input[type=file]').val()

để lấy tên tệp đã chọn, nhưng nó trả về đường dẫn đầy đủ, như trong "C: \ fakepath \ filename.doc". Phần "fakepath" thực sự ở đó - không chắc nó có phải không, nhưng đây là lần đầu tiên tôi làm việc với tên tệp tải lên tệp.

Làm thế nào tôi có thể nhận được tên tập tin (filename.doc)?


11
Trình duyệt thay đổi đường dẫn thực đến C:\fakepath\ các trang web độc hại không thể sử dụng javascript để thu thập thông tin về cấu trúc thư mục máy tính của bạn.
vét vào

Câu trả lời:


294
var filename = $('input[type=file]').val().split('\\').pop();

hoặc bạn chỉ có thể làm (vì nó luôn C:\fakepathđược thêm vào vì lý do bảo mật):

var filename = $('input[type=file]').val().replace(/C:\\fakepath\\/i, '')

1
Chính xác những gì tôi cần, manji! Tôi cũng cần kiểm tra tiện ích mở rộng, vì vậy tôi đã sử dụng ví dụ của bạn theo cách này: var extension = filename.split ('.'). Pop (); để có được điều đó, quá! Cảm ơn!
Marky

Có phải Fakepathvới một vốn F?
alex

16
@MikeDeSimone Tôi đã thử nghiệm phân tách ('\\'). Pop (); trên Win 7, Ubuntu 11.04 và Mac OS X và nó hoạt động tốt trên tất cả chúng.
Alex

3
@Alex: Wow, thật là điên rồ. Vì vậy, nó thực sự chỉ là một cách giải quyết cho mã JS xấu của ai đó từ đó trở lại sẽ không bao giờ được sửa chữa. Tôi đang chạy Safari trên máy Mac và tôi thấy "C: \ fakepath \" trong đó. (Chơi với nó trong jsfiddle .)
Mike DeSimone

1
@ VítorBaptista Các tệp Windows có thể có dấu gạch chéo ngược trong tên của chúng. Có thể có trên MacOS mặc dù "Bạn nên tránh sử dụng dấu hai chấm và gạch chéo trong tên của tệp và thư mục vì một số hệ điều hành và định dạng ổ đĩa sử dụng các ký tự này làm dấu tách thư mục" như được mô tả trong trang web của Apple
joao.arruda

68

Bạn chỉ cần làm mã dưới đây. [0] đầu tiên là truy cập phần tử HTML và thứ hai [0] là truy cập tệp đầu tiên của tệp tải lên (Tôi đã bao gồm xác thực trong trường hợp không có tệp):

    var filename = $('input[type=file]')[0].files.length ? ('input[type=file]')[0].files[0].name : "";

1
Một điều cần xem xét khi sử dụng tùy chọn này: khi bạn nhấp lại vào nút 'Chọn tệp' để hiển thị cửa sổ tệp đang mở, sau đó nhấp vào nút thoát, một lỗi bảng điều khiển sẽ bị ném.
luke_mclachlan

Đúng, bạn đúng, nhưng ý định chỉ đặt mã để lấy tên bởi vì mã đang lấy tên từ vị trí được mã hóa cứng, sẽ cần kiểm tra xem có tệp nào không (một trường hợp này chúng ta đang nói đến chỉ có một tệp, nhưng có thể có nhiều hơn và mã sẽ cần lặp lại bởi tất cả các yếu tố). Nhưng chắc chắn, tôi sẽ cập nhật mã và bao gồm xác nhận này.
Diego Cotini

23

Chrome trả lại C:\fakepath\...vì lý do bảo mật - một trang web sẽ không thể có được thông tin về máy tính của bạn, chẳng hạn như đường dẫn đến tệp trên máy tính của bạn.

Để chỉ lấy phần tên tệp của chuỗi, bạn có thể sử dụng split()...

var file = path.split('\\').pop();

jsFiddle .

... hoặc một biểu thức thông thường ...

var file = path.match(/\\([^\\]+)$/)[1];

jsFiddle .

... hoặc lastIndexOf()...

var file = path.substr(path.lastIndexOf('\\') + 1);

jsFiddle .


21

Nhận đường dẫn làm việc với tất cả các hệ điều hành

var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');

Thí dụ

C:\fakepath\filename.doc 
/var/fakepath/filename.doc

Cả hai trở về

filename.doc
filename.doc

Mã ví dụ var filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');đang sử dụng jQuery.
Zarepheth

13

Đây là cách tôi làm, nó hoạt động khá tốt.

Trong HTML của bạn làm:

<input type="file" name="Att_AttributeID" onchange="fileSelect(event)" class="inputField" />

Sau đó, trong tệp js của bạn tạo một chức năng đơn giản:

function fileSelect(id, e){
    console.log(e.target.files[0].name);
}

Nếu bạn đang thực hiện nhiều tệp, bạn cũng có thể nhận được danh sách bằng cách lặp qua điều này:

e.target.files[0].name

Do ID trường không làm gì trong ngữ cảnh này, nên hàm trong JS sẽ có ít hơn 1 tham số, chỉ e thay vì fileSelect (id, e) chỉ fileSelect (e). Cảm ơn mặc dù cho giải pháp :).
Jasper Lankhorst

8

có thể một số bổ sung để tránh fakepath:

var fileName = $('input[type=file]').val();
var clean=fileName.split('\\').pop(); // clean from C:\fakepath OR C:\fake_path 
alert('clean file name : '+ fileName);

5

Còn những thứ như thế này thì sao?

var pathArray = $('input[type=file]').val().split('\\');
alert(pathArray[pathArray.length - 1]);

4

Nó có phải là jquery? Hoặc bạn chỉ có thể sử dụng nguồn gốc của JavaScript yourpath.split("\\")để phân chia chuỗi thành một mảng?


3

Lấy tệp đầu tiên từ điều khiển và sau đó lấy tên của tệp, nó sẽ bỏ qua đường dẫn tệp trên Chrome và cũng sẽ sửa đường dẫn cho trình duyệt IE. Khi lưu tệp, bạn phải sử dụng System.io.Path.GetFileNamephương thức để chỉ lấy tên tệp cho trình duyệt IE

var fileUpload    = $("#ContentPlaceHolder1_FileUpload_mediaFile").get(0); 
var files         =  fileUpload.files; 
var mediafilename = ""; 

for (var i = 0; i < files.length; i++) { 
  mediafilename = files[i].name; 
} 

2
<script type="text/javascript">

    $('#upload').on('change',function(){
       // output raw value of file input
       $('#filename').html($(this).val().replace(/.*(\/|\\)/, '')); 

        // or, manipulate it further with regex etc.
        var filename = $(this).val().replace(/.*(\/|\\)/, '');
        // .. do your magic

        $('#filename').html(filename);
    });
</script>

1
var filename=location.href.substr(location.href.lastIndexOf("/")+1);
alert(filename);

1

Sự thay thế này có vẻ thích hợp nhất.

$('input[type="file"]').change(function(e){
        var fileName = e.target.files[0].name;
        alert('The file "' + fileName +  '" has been selected.');
});

0

Ở đây bạn có thể gọi như thế này Hãy để đây là điều khiển Tệp đầu vào của tôi

  <input type="file" title="search image" id="file" name="file" onchange="show(this)"  />

Bây giờ đây là Jquery của tôi được gọi khi bạn chọn tệp

<script type="text/javascript">
    function show(input) {
        var fileName = input.files[0].name;
        alert('The file "' + fileName + '" has been selected.');               
            }

</script>

0

Chúng tôi cũng có thể loại bỏ nó bằng cách sử dụng match

var fileName = $('input:file').val().match(/[^\\/]*$/)[0];
$('#file-name').val(fileName);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.