ใช้ jQuery เพื่อรับชื่อไฟล์ที่เลือกของไฟล์ที่ไม่มีพา ธ


153

ฉันใช้สิ่งนี้:

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

เพื่อรับชื่อไฟล์ที่เลือก แต่มันกลับเส้นทางแบบเต็มเช่นเดียวกับใน "C: \ fakepath \ filename.doc" ส่วน "fakepath" มีอยู่จริง - ไม่แน่ใจว่าควรจะเป็นหรือไม่ แต่นี่เป็นครั้งแรกที่ฉันทำงานกับชื่อไฟล์ที่อัพโหลดไฟล์

ฉันจะได้รับชื่อไฟล์ (filename.doc) ได้อย่างไร


11
เบราว์เซอร์เปลี่ยนเส้นทางที่แท้จริงไปยังC:\fakepath\ เว็บไซต์ที่เป็นอันตรายดังนั้นจึงไม่สามารถใช้จาวาสคริปต์เพื่อรวบรวมข้อมูลเกี่ยวกับโครงสร้างไดเรกทอรีของคอมพิวเตอร์ของคุณ
drudge

คำตอบ:


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

หรือคุณสามารถทำได้ (เพราะมันC:\fakepathถูกเพิ่มเข้ามาเสมอเพื่อเหตุผลด้านความปลอดภัย):

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

1
สิ่งที่ฉันต้องการจริงๆแมนจิ! ฉันต้องตรวจสอบส่วนขยายด้วยดังนั้นฉันจึงใช้ตัวอย่างของคุณในลักษณะนี้: var extension = filename.split ('.'). pop (); เพื่อให้ได้เช่นกัน! ขอบคุณ!
marky

มันมาFakepathพร้อมกับทุน F หรือไม่?
alex

16
@MikeDeSimone ฉันได้ทดสอบ split ('\\'). pop (); บน Win 7, Ubuntu 11.04 และ Mac OS X และทำงานได้ดีกับพวกเขาทั้งหมด
Alex

3
@Alex: ว้าวมันค่อนข้างบ้า ดังนั้นมันจึงเป็นแค่การแก้ปัญหาสำหรับรหัส JS ที่ไม่ดีของใครบางคนตั้งแต่ทางกลับกันซึ่งจะไม่ได้รับการแก้ไข ฉันใช้งาน Safari บนเครื่อง Mac และฉันเห็น "C: \ fakepath \" ในนั้น (เล่นกับมันในjsfiddle .)
Mike DeSimone

1
@ ไฟล์VítorBaptista Windows ไม่สามารถมีแบ็กสแลชในชื่อได้ เป็นไปได้บน MacOS แม้ว่า"คุณควรหลีกเลี่ยงการใช้โคลอนและเครื่องหมายสแลชในชื่อของไฟล์และโฟลเดอร์เนื่องจากระบบปฏิบัติการและรูปแบบไดรฟ์บางตัวใช้อักขระเหล่านี้เป็นตัวคั่นไดเรกทอรี"ตามที่อธิบายไว้ในเว็บไซต์ของ Apple
joao.arruda

68

คุณเพียงแค่ต้องทำรหัสด้านล่าง แรก [0] คือการเข้าถึงองค์ประกอบ HTML และที่สอง [0] คือการเข้าถึงไฟล์แรกของการอัปโหลดไฟล์ (ฉันรวมการตรวจสอบในกรณีที่ไม่มีไฟล์):

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

1
สิ่งหนึ่งที่ควรพิจารณาเมื่อใช้ตัวเลือกนี้: เมื่อคุณคลิกอีกครั้งที่ปุ่ม 'เลือกไฟล์' เพื่อเปิดหน้าต่างไฟล์ที่เปิดขึ้นมาจากนั้นคลิกที่ปุ่มหลบหนีข้อผิดพลาดคอนโซลจะถูกโยนทิ้ง
luke_mclachlan

ใช่คุณพูดถูก แต่ความตั้งใจใส่รหัสเพื่อรับชื่อเพราะเมื่อรหัสกำลังรับชื่อจากตำแหน่งที่กำหนดรหัสยากจะต้องตรวจสอบว่ามีไฟล์หรือไม่ (สำหรับกรณีนี้เรากำลังพูดถึง เพียงไฟล์เดียว แต่อาจมีมากกว่าและรหัสจะต้องวนซ้ำโดยองค์ประกอบทั้งหมด) แต่แน่นอนฉันจะอัปเดตรหัสและรวมการตรวจสอบนี้ด้วย
Diego Cotini

23

Chrome ส่งคืนC:\fakepath\...ด้วยเหตุผลด้านความปลอดภัย - เว็บไซต์ไม่ควรรับข้อมูลเกี่ยวกับคอมพิวเตอร์ของคุณเช่นเส้นทางไปยังไฟล์ในคอมพิวเตอร์ของคุณ

ในการรับส่วนของชื่อไฟล์ของสตริงคุณสามารถใช้split()...

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

jsFiddle

... หรือนิพจน์ทั่วไป ...

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

jsFiddle

... หรือlastIndexOf()...

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

jsFiddle


21

รับเส้นทางการทำงานกับระบบปฏิบัติการทั้งหมด

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

ตัวอย่าง

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

ทั้งสองกลับมา

filename.doc
filename.doc

โค้ดตัวอย่างvar filename = $('input[type=file]').val().replace(/.*(\/|\\)/, '');กำลังใช้ jQuery
Zarepheth

13

นี่คือวิธีที่ฉันทำมันทำงานได้ค่อนข้างดี

ใน HTML ของคุณ:

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

จากนั้นในไฟล์ js ของคุณสร้างฟังก์ชั่นง่าย ๆ :

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

หากคุณกำลังทำหลายไฟล์คุณควรจะสามารถรับรายชื่อได้โดยการวนซ้ำสิ่งนี้

e.target.files[0].name

เนื่องจาก ID ฟิลด์ไม่ได้ทำสิ่งใดในบริบทนี้ฟังก์ชันใน JS ควรมี 1 พารามิเตอร์น้อยกว่าเพียงแค่ e แทน fileSelect (id, e) เพียงแค่ fileSelect (e) ขอบคุณสำหรับการแก้ปัญหา :)
Jasper Lankhorst

8

อาจจะมีบางส่วนเพื่อหลีกเลี่ยงการ 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);


4

มันจะต้องมีการ jQuery? หรือคุณสามารถใช้พื้นเมืองของ JavaScript yourpath.split("\\")เพื่อแยกสตริงเป็นอาร์เรย์ได้หรือไม่


3

รับไฟล์แรกจากตัวควบคุมจากนั้นรับชื่อของไฟล์ไฟล์นั้นจะไม่สนใจเส้นทางของไฟล์บน Chrome และจะทำการแก้ไขเส้นทางสำหรับเบราว์เซอร์ IE ในการบันทึกไฟล์คุณต้องใช้System.io.Path.GetFileNameวิธีการรับชื่อไฟล์สำหรับเบราว์เซอร์ 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

ทางเลือกนี้ดูเหมือนจะเหมาะสมที่สุด

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

0

ที่นี่คุณสามารถเรียกสิ่งนี้ได้ให้นี่คือการควบคุมไฟล์อินพุตของฉัน

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

ตอนนี้นี่คือ Jquery ของฉันที่ถูกเรียกใช้เมื่อคุณเลือกไฟล์

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

</script>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.