Làm cách nào để có được đường dẫn đầy đủ của tệp đã chọn khi thay đổi <input type = 'file'> bằng cách sử dụng javascript, jquery-ajax?


240

Cách nhận đường dẫn đầy đủ của tệp trong khi chọn tệp bằng cách sử dụng <input type=‘file’>

<input type="file" id="fileUpload">
<script type="text/javascript">
function getFilePath(){
     $('input[type=file]').change(function () {
         var filePath=$('#fileUpload').val(); 
     });
}
</script>

nhưng var filePath chứa only nametệp đã chọn, không phải tệp full path.
Tôi đã tìm kiếm nó trên mạng, nhưng có vẻ như vì lý do bảo mật, các trình duyệt (FF, chrome) chỉ đưa ra tên của tệp.
Có cách nào khác để có được đường dẫn đầy đủ của tập tin đã chọn không?




@nauphal cảm ơn vì đã bình luận nhưng có cách nào khác để có được đường dẫn đầy đủ của tệp đã chọn không?
Yogesh Pingle

1
Nếu bạn đang ở trong trường hợp bạn muốn lấy đường dẫn của tệp trên máy chủ , (ví dụ: xây dựng giao diện web cho tiện ích dòng lệnh để chạy trên máy chủ), bạn luôn có thể tạo đường dẫn tương đối, gửi nó qua dưới dạng <tùy chọn> và sử dụng tiện ích cây hoặc nhập trước để cho phép người dùng chọn nó và sau đó máy chủ xử lý tệp.
dardenfall

Câu trả lời:


164

Vì lý do bảo mật, các trình duyệt không cho phép điều này, tức là JavaScript trong trình duyệt không có quyền truy cập vào Hệ thống tệp, tuy nhiên sử dụng API tệp HTML5, chỉ Firefox cung cấp một thuộc mozFullPathtính, nhưng nếu bạn cố lấy giá trị thì nó sẽ trả về một chuỗi trống:

$('input[type=file]').change(function () {
    console.log(this.files[0].mozFullPath);
});

http://jsfiddle.net/SCK5A/

Vì vậy, đừng lãng phí thời gian của bạn.

chỉnh sửa: Nếu bạn cần đường dẫn của tệp để đọc tệp, bạn có thể sử dụng API FileReader thay thế. Đây là một câu hỏi liên quan trên SO: Xem trước một hình ảnh trước khi nó được tải lên.


1
Xem liên kết này vì nó đã giúp tôi với vấn đề tương tự.
Amir Tugi

... Tiêu đề của câu hỏi được liên kết là: Xem trước một hình ảnh trước khi nó được tải lên .
không xác định

Nhưng nó đã cho tôi URL cho đường dẫn gửi đến máy chủ
Amir Tugi

1
@AmirTugi Giải pháp đó đọc một tập tin. Nó không liên quan gì đến đường dẫn của tệp trên hệ thống tệp của người dùng.
không xác định

Vậy làm thế nào trang web này có thể làm điều đó?
SaidbakR

102

Thử cái này:

Nó sẽ cung cấp cho bạn một đường dẫn tạm thời không phải là đường dẫn chính xác, bạn có thể sử dụng tập lệnh này nếu bạn muốn hiển thị các hình ảnh được chọn như trong ví dụ jsfiddle này (Hãy thử bằng cách chọn hình ảnh cũng như các tệp khác): -

NHANH CHÓNG

Đây là mã: -

HTML: -

<input type="file" id="i_file" value=""> 
<input type="button" id="i_submit" value="Submit">
<br>
<img src="" width="200" style="display:none;" />
<br>
<div id="disp_tmp_path"></div>

JS: -

$('#i_file').change( function(event) {
    var tmppath = URL.createObjectURL(event.target.files[0]);
    $("img").fadeIn("fast").attr('src',URL.createObjectURL(event.target.files[0]));

    $("#disp_tmp_path").html("Temporary Path(Copy it and try pasting it in browser address bar) --> <strong>["+tmppath+"]</strong>");
});

Nó không chính xác những gì bạn đang tìm kiếm, nhưng có thể nó có thể giúp bạn ở đâu đó.


Có cách nào để làm điều này với các loại tệp khác: pdf, docx, v.v. và thay vì hình ảnh để hiển thị Biểu tượng không? Đối với mục đích sử dụng của tôi, tôi muốn lưu trữ các tệp trên trang trước khi gửi chúng cho người dùng cơ hội thêm nhận xét để tải lên với nó giống như một tin nhắn có văn bản.
dùng1040975

Tôi chỉ cần đặt nội dung của "tmppath" vào thanh địa chỉ trình duyệt? Tôi đã thử và nó không hoạt động.
MacGruber

@GangsarSwaPurba Thật không may, nó không hoạt động trong IE9 - xem URL.createObjectURL () .
naXa

@naXa tốt, tôi sẽ chỉnh sửa nhận xét của tôi ở trên. uw, thật không may, tôi không thể chỉnh sửa nhận xét của mình
Gangsar Swapurba

2
Trong dòng thứ 3, bạn nên sử dụng biến tmppath thay vì URL.createObjectURL (event.target.files [0]), điều này được tối ưu hóa hơn.
Wessam El Mahdy

17

Bạn không thể làm như vậy - trình duyệt sẽ không cho phép điều này vì những lo ngại về bảo mật.

Khi một tệp được chọn bằng cách sử dụng kiểu nhập = đối tượng tệp, giá trị của thuộc tính giá trị phụ thuộc vào giá trị của cài đặt bảo mật "Bao gồm đường dẫn thư mục cục bộ khi tải tệp lên máy chủ" cho vùng bảo mật được sử dụng để hiển thị trang Web chứa đối tượng đầu vào.

Tên tệp đủ điều kiện của tệp đã chọn chỉ được trả về khi cài đặt này được bật. Khi cài đặt bị tắt, Internet Explorer 8 thay thế đường dẫn thư mục và ổ đĩa cục bộ bằng chuỗi C: \ fakepath \ để ngăn tiết lộ thông tin không phù hợp.

Và khác

Bạn đã bỏ lỡ );điều này ở cuối chức năng sự kiện thay đổi.

Cũng không tạo chức năng cho sự kiện thay đổi thay vào đó chỉ sử dụng nó như dưới đây,

<script type="text/javascript">

    $(function()
    {
        $('#fileUpload').on('change',function ()
        {
            var filePath = $(this).val();
            console.log(filePath);
        });
    });

</script>

19
Đã thử mã của bạn nhưng nó cho tôi đường dẫn sai. tập tin của tôi nằm trong Dthư mục nhưng giá trị đang đếnC:\fakepath\test.xls
Rahul Munjal

3
C: \ fakepath \ fileName.xls ... có ai biết cách giải quyết vấn đề này không?
André Dos Santos

14

Bạn không thể. Bảo mật ngăn bạn biết bất cứ điều gì về hệ thống lưu trữ của máy khách - nó thậm chí có thể không có! Đó có thể là MAC, PC, Tablet hoặc tủ lạnh hỗ trợ internet - bạn không biết, không thể biết và sẽ không biết. Và cho phép bạn có đường dẫn đầy đủ có thể cung cấp cho bạn một số thông tin về máy khách - đặc biệt nếu đó là ổ đĩa mạng chẳng hạn.

Trong thực tế, bạn có thể có được nó trong các điều kiện cụ thể, nhưng nó yêu cầu điều khiển ActiveX và sẽ không hoạt động trong 99,99% trường hợp.

Bạn không thể sử dụng nó để khôi phục tệp về vị trí ban đầu (vì bạn hoàn toàn không kiểm soát được nơi tải xuống được lưu trữ hoặc ngay cả khi chúng được lưu trữ) vì vậy trong thực tế, nó không được sử dụng nhiều cho bạn.


11

Ý bạn là sao?

$('#i_file').change( function(event) {
var tmppath = URL.createObjectURL(event.target.files[0]);
    $("img").fadeIn("fast").attr('src',tmppath);       
});

4
Điều này không đưa ra đường dẫn đến tập tin. Tại sao upvote nhiều lần?
FlowUI. SimpleUITesting.com

7

Bạn có thể sử dụng mã sau đây để nhận URL cục bộ hoạt động cho tệp được tải lên:

<script type="text/javascript">    
    var path = (window.URL || window.webkitURL).createObjectURL(file);
    console.log('path', path);
</script>

4

Một lưu ý thú vị: mặc dù điều này không có sẵn trên web, nhưng nếu bạn đang sử dụng JS trong Electron thì bạn có thể làm điều này.

Sử dụng đầu vào tệp HTML5 tiêu chuẩn, bạn sẽ nhận được một thuộc tính bổ sung pathtrên các tệp đã chọn, chứa đường dẫn tệp thực.

Tài liệu đầy đủ tại đây: https://github.com/electron/electron/blob/master/docs/api/file-object.md


1

Bạn có thể, nếu tải lên toàn bộ thư mục là một tùy chọn cho bạn

<input type="file" webkitdirectory directory multiple/>

sự kiện thay đổi sẽ chứa:

.target.files[...].webkitRelativePath: "FOLDER/FILE.ext"

1

bạn không bao giờ nên làm như vậy ... và tôi nghĩ rằng việc thử nó trong các trình duyệt mới nhất là vô ích (từ những gì tôi biết) ... mặt khác, tất cả các trình duyệt mới nhất sẽ không cho phép điều này ...

Một số liên kết khác mà bạn có thể đi qua, để tìm một cách giải quyết như lấy giá trị máy chủ, nhưng không phải trong máy khách (javascript)

Đường dẫn đầy đủ từ đầu vào tệp bằng jQuery
Cách lấy đường dẫn tệp từ biểu mẫu nhập HTML trong Firefox 3


-1

phần tử tệp có và mảng gọi filesnó chứa tất cả những thứ cần thiết bạn cần

var file = document.getElementById("upload");

file.addEventListener("change", function() {
    for (var i = 0; i < file.files.length; i++) {
        console.log(file.files[i].name);
    }
}, false);

2
Nó không cung cấp đường dẫn đầy đủ của tệp được tải lên.
Sergiu Mare

-3

Bạn có thể lấy đường dẫn đầy đủ của tệp đã chọn để chỉ tải lên bằng IE11 và MS Edge.

var fullPath = Request.Form.Files["myFile"].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.