Làm cách nào để giải quyết C: \ fakepath?


256
<input type="file" id="file-id" name="file_name" onchange="theimage();">

Đây là nút tải lên của tôi.

<input type="text" name="file_path" id="file-path">

Đây là trường văn bản nơi tôi phải hiển thị đường dẫn đầy đủ của tệp.

function theimage(){
 var filename = document.getElementById('file-id').value;
 document.getElementById('file-path').value = filename;
 alert(filename);
}

Đây là JavaScript giải quyết vấn đề của tôi. Nhưng trong giá trị cảnh báo mang lại cho tôi

C:\fakepath\test.csv 

và Mozilla cho tôi:

test.csv

Nhưng tôi muốn đường dẫn tập tin đầy đủ địa phương . Làm thế nào để giải quyết vấn đề này?

Nếu điều này là do vấn đề bảo mật của trình duyệt thì cách thay thế để làm điều này là gì?


41
Đây là triển khai bảo mật của trình duyệt - trình duyệt đang bảo vệ bạn khỏi việc truy cập cấu trúc đĩa của bạn. Nó có thể hữu ích nếu bạn có thể giải thích lý do tại sao bạn muốn đường dẫn đầy đủ.
Stuart

1
Bạn có ý nghĩa gì bởi url đầy đủ ? Địa chỉ của tập tin tải lên?
gor

4
Đối với bản ghi, IE chỉ cung cấp bit "fakepath" vì họ không muốn các máy chủ "mong đợi" đường dẫn bị phá vỡ. Mặt khác, giống như các trình duyệt khác vì lý do bảo mật, bạn sẽ chỉ nhận được tên tệp (không có đường dẫn). Quan trọng hơn, trừ khi bạn có ý định độc hại, tôi không thể hiểu tại sao biết đường dẫn cung cấp bất cứ điều gì hữu ích.
scunliffe

2
browser security issue~ nếu nó được triển khai trong trình duyệt (đúng như vậy) thì rất khó có khả năng bạn có thể phá vỡ nó
Ross

13
Trời ạ, tôi giữ tất cả các tập tin của mình C:\fakepath, vì vậy bây giờ mọi người đều biết cấu trúc thư mục của tôi.
mbomb007

Câu trả lời:


173

Một số trình duyệt có tính năng bảo mật ngăn JavaScript biết đường dẫn đầy đủ cục bộ của tệp của bạn. Điều này có ý nghĩa - với tư cách là khách hàng, bạn không muốn máy chủ biết hệ thống tệp của máy cục bộ. Sẽ thật tuyệt nếu tất cả các trình duyệt đã làm điều này.


9
Nếu trình duyệt không gửi đường dẫn tệp cục bộ, không có cách nào để tìm ra nó.
Petteri Hietavirta

47
Chỉ cần đăng mẫu: trình duyệt sẽ chăm sóc tải lên. Trang web của bạn không cần biết đường dẫn đầy đủ về máy khách.
Rup

2
@ruffp Bạn chỉ có thể tải lên bằng một bài đăng vì vậy bạn cần đặt tải lên trong một biểu mẫu và gửi nó. Điều đó vẫn sẽ sử dụng điều khiển tải lên tệp tiêu chuẩn để chọn tệp và bạn vẫn sẽ không cần tên tệp khách hàng đầy đủ.
Rup

6
Tôi nghi ngờ có bất cứ điều gì độc hại mà một trang web bình thường có thể làm với máy cục bộ của bạn mà không cần một số loại plugin đáng tin cậy như Flash hoặc Java. Đó là nhiều hơn một điều riêng tư. Ví dụ, nếu bạn đang tải lên từ máy tính của bạn, bạn sẽ được để cho máy chủ biết tên đăng nhập của bạn trên máy tính của bạn hoặc địa phương miền ( c:\users\myname\desktophoặc /Users/myname/Desktop/hoặc bất kỳ). Đó không phải là điều mà một máy chủ web có bất kỳ doanh nghiệp nào biết.
Joe Enos

8
Quyền riêng tư hầu như luôn liên quan đến bảo mật và lỗ hổng vì thông tin có thể được sử dụng để chống lại ai đó. Tấn công thường xuyên khai thác nhiều vấn đề để đạt được mục tiêu của họ. Bất cứ ai không nhận ra các mối nguy hiểm không nên được phép ở gần mã khác ngoài Hello World mà không cần thêm các hội thảo về cách hoang tưởng.
Archimedix

70

Sử dụng

document.getElementById("file-id").files[0].name; 

thay vì

document.getElementById('file-id').value

16
Trong Chrome 44.0.2403.125, điều này chỉ cung cấp cho bạn tên tệp.
khoảng cách

4
Sau đó, sử dụng document.getEuityById ("file-id"). Files [0] .path. Hoạt động tốt cho tôi.
Loaderon

Cảm ơn @Loaderon bạn nên đăng bài này như một câu trả lời!
7geeky

45

Tôi sử dụng đối tượng FileReader trong onchangesự kiện đầu vào cho loại tệp đầu vào của bạn! Ví dụ này sử dụng hàm readAsDataURL và vì lý do đó, bạn nên có một thẻ. Đối tượng FileReader cũng có readAsBinaryString để lấy dữ liệu nhị phân, sau này có thể được sử dụng để tạo cùng một tệp trên máy chủ của bạn

Thí dụ:

var input = document.getElementById("inputFile");
var fReader = new FileReader();
fReader.readAsDataURL(input.files[0]);
fReader.onloadend = function(event){
    var img = document.getElementById("yourImgTag");
    img.src = event.target.result;
}

Bất cứ ý tưởng tại sao ngay cả điều này không làm việc trên localhost? nguồn được đặt là src = "C: \ fakepath \ filename.jpg" nhưng console.logging phần tử hình ảnh cho biết src là một dataURL
galki

Trả lời: tái lập xương sống: /
galki

1
Bạn không biết bao nhiêu sự thất vọng mục này đã lưu. Đó là một viên kim cương thô ... chỉ có 12 phiếu bầu nhưng xứng đáng được nhiều hơn thế. Vui mừng khi tôi nhìn xuống phía dưới vì các mục khác với số lần nâng cao hơn nhiều không hoạt động và FormData () sẽ không thực hiện thủ thuật cho mục đích của chúng tôi. Làm tốt!
dùng1585204

9
Câu hỏi là yêu cầu đường dẫn tệp không phải là nội dung tệp.
Quentin

@Quentin: có bạn đúng, nhưng rõ ràng mục đích của OP là có thể bằng cách nào đó có thể tải tệp lên máy chủ. Do đó, giải pháp này sẽ hoạt động chắc chắn rất hữu ích cho tất cả những người tìm kiếm cách tải tệp lên máy chủ bằng cách sử dụng JS.
dùng18490

36

Nếu bạn truy cập Internet Explorer, Công cụ, Tùy chọn Internet, Bảo mật, Tùy chỉnh, hãy tìm "Bao gồm đường dẫn thư mục cục bộ Khi tải tệp lên máy chủ" (đó là một cách khá đơn giản) và nhấp vào "Bật". Điều này sẽ làm việc


2
Có cái gì đó tương tự như Chrome không?
Zaven Zareyan

11

Tôi rất vui khi các trình duyệt quan tâm để cứu chúng tôi khỏi các tập lệnh xâm nhập và tương tự. Tôi không hài lòng với việc IE đưa thứ gì đó vào trình duyệt khiến cho việc sửa kiểu đơn giản trông giống như một cuộc tấn công hack!

Tôi đã sử dụng <span> để thể hiện đầu vào tệp để tôi có thể áp dụng kiểu dáng phù hợp cho <div> thay vì <input> (một lần nữa, vì IE). Bây giờ do IE này muốn hiển thị cho Người dùng một đường dẫn có giá trị được bảo đảm để bảo vệ họ và ở mức độ ít gây sợ hãi nhất (nếu không hoàn toàn khiến họ sợ hãi ?!) ... THÊM IE-CRAP!

Nhưng dù sao, nhờ những người đã đăng lời giải thích ở đây: IE Browser Security: Nối "fakepath" vào đường dẫn tệp trong đầu vào [type = "file"] , tôi đã kết hợp một trình sửa lỗi nhỏ trên ...

Đoạn mã dưới đây thực hiện hai điều - nó sửa một lỗi IE8 trong đó sự kiện onChange không kích hoạt cho đến khi trường tải lên onBlur và nó cập nhật một phần tử với filepath đã được làm sạch sẽ không khiến Người dùng sợ hãi.

// self-calling lambda to for jQuery shorthand "$" namespace
(function($){
    // document onReady wrapper
    $().ready(function(){
        // check for the nefarious IE
        if($.browser.msie) {
            // capture the file input fields
            var fileInput = $('input[type="file"]');
            // add presentational <span> tags "underneath" all file input fields for styling
            fileInput.after(
                $(document.createElement('span')).addClass('file-underlay')
            );
            // bind onClick to get the file-path and update the style <div>
            fileInput.click(function(){
                // need to capture $(this) because setTimeout() is on the
                // Window keyword 'this' changes context in it
                var fileContext = $(this);
                // capture the timer as well as set setTimeout()
                // we use setTimeout() because IE pauses timers when a file dialog opens
                // in this manner we give ourselves a "pseudo-onChange" handler
                var ieBugTimeout = setTimeout(function(){
                    // set vars
                    var filePath     = fileContext.val(),
                        fileUnderlay = fileContext.siblings('.file-underlay');
                    // check for IE's lovely security speil
                    if(filePath.match(/fakepath/)) {
                        // update the file-path text using case-insensitive regex
                        filePath = filePath.replace(/C:\\fakepath\\/i, '');
                    }
                    // update the text in the file-underlay <span>
                    fileUnderlay.text(filePath);
                    // clear the timer var
                    clearTimeout(ieBugTimeout);
                }, 10);
            });
        }
    });
})(jQuery);

Xin lưu ý rằng điều này không hoạt động trên IE, do đó; Tôi đã thay thế như sau: filePath.subopes (filePath.lastIndexOf ('\\') + 1, filePath.length)
Bassel Kh

6

Tôi đến cùng một vấn đề. Trong IE8, nó có thể được xử lý bằng cách tạo một đầu vào ẩn sau khi điều khiển đầu vào tệp. Việc điền vào giá trị này với giá trị của anh chị em trước đó. Trong IE9, điều này đã được sửa.

Lý do của tôi muốn biết đường dẫn đầy đủ là để tạo bản xem trước hình ảnh javascript trước khi tải lên. Bây giờ tôi phải tải lên tập tin để tạo một bản xem trước của hình ảnh được chọn.


1
Nếu ai đó muốn xem hình ảnh trước khi tải lên, họ có thể xem nó trên máy tính của họ.
mbomb007

4

Nếu bạn thực sự cần gửi đường dẫn đầy đủ của tệp được mã hóa, thì có lẽ bạn phải sử dụng một cái gì đó như một applet java đã ký vì không có cách nào để có được thông tin này nếu trình duyệt không gửi nó.


Làm thế nào để fullpath đường dẫn gốc <input type = "file" accept = ". jpeg, .jpg, .png">. Tôi nhận được đường dẫn giả, làm thế nào để reslove nó
Govind Sharma


1

Sử dụng trình đọc tệp:

$(document).ready(function() {
        $("#input-file").change(function() {
            var length = this.files.length;
            if (!length) {
                return false;
            }
            useImage(this);
        });
    });

    // Creating the function
    function useImage(img) {
        var file = img.files[0];
        var imagefile = file.type;
        var match = ["image/jpeg", "image/png", "image/jpg"];
        if (!((imagefile == match[0]) || (imagefile == match[1]) || (imagefile == match[2]))) {
            alert("Invalid File Extension");
        } else {
            var reader = new FileReader();
            reader.onload = imageIsLoaded;
            reader.readAsDataURL(img.files[0]);
        }

        function imageIsLoaded(e) {
            $('div.withBckImage').css({ 'background-image': "url(" + e.target.result + ")" });

        }
    }

-1

Vì vậy, trong trường hợp của tôi, tôi đang sử dụng môi trường phát triển asp.net, vì vậy tôi muốn tải lên những dữ liệu đó trong yêu cầu không đồng bộ ajax, trong [webMethod] bạn không thể bắt được trình tải lên tệp vì nó không phải là phần tử tĩnh, vì vậy tôi phải tạo doanh thu cho giải pháp đó bằng cách sửa đường dẫn, hơn là chuyển đổi hình ảnh mong muốn thành byte để lưu nó trong DB.

Đây là chức năng javascript của tôi, hy vọng nó sẽ giúp bạn:

function FixPath(Path)
         {
             var HiddenPath = Path.toString();
             alert(HiddenPath.indexOf("FakePath"));

             if (HiddenPath.indexOf("FakePath") > 1)
             {
                 var UnwantedLength = HiddenPath.indexOf("FakePath") + 7;
                 MainStringLength = HiddenPath.length - UnwantedLength;
                 var thisArray =[];
                 var i = 0;
                 var FinalString= "";
                 while (i < MainStringLength)
                 {
                     thisArray[i] = HiddenPath[UnwantedLength + i + 1];
                     i++;
                 }
                 var j = 0;
                 while (j < MainStringLength-1)
                 {
                     if (thisArray[j] != ",")
                     {
                         FinalString += thisArray[j];
                     }
                     j++;
                 }
                 FinalString = "~" + FinalString;
                 alert(FinalString);
                 return FinalString;
             }
             else
             {
                 return HiddenPath;
             }
         }

ở đây chỉ để thử nghiệm:

 $(document).ready(function () {
             FixPath("hakounaMatata:/7ekmaTa3mahaLaziz/FakePath/EnsaLmadiLiYghiz");
         });
// this will give you : ~/EnsaLmadiLiYghiz

-3

Bổ sung cho câu trả lời của Sardesh Sharma:

document.getElementById("file-id").files[0].path

Đối với con đường đầy đủ.


Điều này trả về undefinedcho tôi trong FireFox 75.0. Có paththực sự tồn tại? Bạn có bất kỳ tài liệu tham khảo về tài liệu về nó?
Jose Manuel Abarca Rodríguez

1
Chào! Tôi đã đăng câu trả lời này sau khi cố gắng tự giải quyết vấn đề và thành công khi sử dụng đường dẫn. Tôi không nhớ trong dự án nào tôi đã thử, nhưng tôi luôn sử dụng Google Chrome, có lẽ giải pháp này chỉ phù hợp với trình duyệt đó. Và nó thậm chí có thể trở nên lỗi thời do cập nhật trình duyệt. Xin lỗi vì không thể giúp thêm: /
Loaderon
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.