C: \ fakepath कैसे हल करें?


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

यह मेरा अपलोड बटन है।

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

यह टेक्स्ट फ़ील्ड है जहाँ मुझे फ़ाइल का पूरा रास्ता दिखाना है।

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

यह जावास्क्रिप्ट है जो मेरी समस्या को हल करता है। लेकिन चेतावनी मूल्य में मुझे देता है

C:\fakepath\test.csv 

और मोज़िला मुझे देता है:

test.csv

लेकिन मैं स्थानीय पूरी तरह से योग्य फ़ाइल पथ चाहता हूं । इस समस्या को कैसे हल करें?

यदि यह ब्राउज़र सुरक्षा समस्या के कारण है, तो ऐसा करने का वैकल्पिक तरीका क्या होना चाहिए?


41
यह ब्राउज़र का सुरक्षा कार्यान्वयन है - ब्राउज़र आपको आपकी डिस्क संरचना तक पहुँचने से बचा रहा है। यह मदद कर सकता है यदि आप बता सकते हैं कि आप पूर्ण पथ क्यों चाहते हैं।
स्टुअर्ट

1
पूर्ण url से आपका क्या अभिप्राय है ? अपलोड की गई फ़ाइल का पता?
गोर

4
रिकॉर्ड के लिए, IE केवल "फर्जी" बिट देता है क्योंकि वे सर्वर नहीं चाहते थे जो "उम्मीद" कर रहे थे कि वह टूटने का मार्ग है। अन्यथा सुरक्षा कारणों से अन्य ब्राउज़रों की तरह आपको केवल फ़ाइल नाम (कोई रास्ता नहीं) मिलेगा। इससे भी महत्वपूर्ण बात, जब तक आपके दुर्भावनापूर्ण इरादे नहीं हैं, मैं यह नहीं देख सकता कि रास्ता जानने से कुछ भी उपयोगी क्यों नहीं होता है।
स्क्यूलिफ

2
browser security issue~ अगर इसके ब्राउज़र में लागू किया गया (ठीक है तो) तो इसकी अत्यधिक संभावना नहीं है कि आप इसे दरकिनार कर सकते हैं
रॉस

13
गोश डारनिट, मैं अपनी सभी फाइलें अंदर रखता हूं C:\fakepath, इसलिए अब हर कोई मेरी निर्देशिका संरचना को जानता है।
mbomb007

जवाबों:


173

कुछ ब्राउज़रों में एक सुरक्षा सुविधा होती है जो जावास्क्रिप्ट को आपकी फ़ाइल के स्थानीय पूर्ण पथ को जानने से रोकती है। यह समझ में आता है - एक ग्राहक के रूप में, आप नहीं चाहते कि सर्वर आपके स्थानीय मशीन के फाइल सिस्टम को जाने। सभी ब्राउज़रों ने ऐसा किया तो अच्छा होगा।


9
यदि ब्राउज़र स्थानीय फ़ाइल पथ नहीं भेजता है, तो इसे खोजने का कोई तरीका नहीं है।
पेट्री हेटेविर्टा

47
बस फॉर्म पोस्ट करें: ब्राउज़र अपलोड का ख्याल रखेगा। आपकी वेब साइट को क्लाइंट पर पूरा रास्ता जानने की आवश्यकता नहीं है।
Rup

2
@ruffp आप केवल एक पोस्ट के साथ अपलोड कर सकते हैं, इसलिए आपको अपलोड को एक फॉर्म में रखना होगा और सबमिट करना होगा। वह अभी भी फ़ाइल चुनने के लिए एक मानक फ़ाइल अपलोड नियंत्रण का उपयोग करेगा और आपको अभी भी पूर्ण क्लाइंट फ़ाइल नाम की आवश्यकता नहीं होगी।
Rup

6
मुझे संदेह है कि कुछ सामान्य दुर्भावनापूर्ण वेबसाइट है जो फ्लैश या जावा जैसे विश्वसनीय प्लगइन के बिना आपके स्थानीय मशीन को कर सकती है। यह एक निजता की बात है। उदाहरण के लिए, यदि आप अपने डेस्कटॉप से ​​अपलोड कर रहे हैं, तो आप सर्वर को आपके स्थानीय मशीन या डोमेन ( c:\users\myname\desktopया /Users/myname/Desktop/या जो भी) पर अपना उपयोगकर्ता नाम जानते हैं । यह ऐसा कुछ नहीं है जिसे वेबसर्वर के पास जानने का कोई व्यवसाय है।
जो एनोस

8
गोपनीयता लगभग हमेशा सुरक्षा और भेद्यता से संबंधित होती है क्योंकि किसी के खिलाफ जानकारी का उपयोग किया जा सकता है। हमलों अक्सर अपने लक्ष्यों को प्राप्त करने के लिए कई मुद्दों का फायदा उठाते हैं। खतरों को नहीं पहचानने वाले किसी को भी हैलो वर्ल्ड के अतिरिक्त कोड के पास अनुमति नहीं दी जानी चाहिए बिना अतिरिक्त-कैसे-के-पैरोडी कार्यशालाओं के।
आर्किमिडिक्स

70

उपयोग

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

के बजाय

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

16
Chrome 44.0.2403.125 में, यह आपको केवल फ़ाइल नाम प्रदान करता है।
अंतर

4
फिर document.getElementById ("file-id") का उपयोग करें। फाइलें [0] .पथ मेरे लिए ठीक काम करता है।
लोडरन

धन्यवाद @ लादेरोन आपको इसे उत्तर के रूप में पोस्ट करना चाहिए!
7geeky

45

मैं onchangeआपके इनपुट फ़ाइल प्रकार के लिए इनपुट इवेंट पर ऑब्जेक्ट FileReader का उपयोग करता हूं ! यह उदाहरण readAsDataURL फ़ंक्शन का उपयोग करता है और इस कारण से आपके पास एक टैग होना चाहिए। FileReader ऑब्जेक्ट में बाइनरी डेटा प्राप्त करने के लिए readAsBinaryString भी है, जिसे बाद में उसी फ़ाइल को अपने सर्वर पर बनाने के लिए उपयोग किया जा सकता है

उदाहरण:

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

किसी भी विचार क्यों यह भी लोकलहोस्ट पर काम नहीं कर रहा है? स्रोत src = "C: \ fakepath \ filename.jpg" के रूप में सेट हो जाता है, लेकिन कंसोल.लॉगिंग तत्व तत्व का कहना है कि src एक dataURL है
galki

उत्तर: बैकबोन
रेंडरिंग

1
आपको पता नहीं है कि इस प्रविष्टि ने कितनी निराशा को बचाया। यह किसी न किसी में एक हीरा है ... केवल 12 वोटों पर, लेकिन बहुत अधिक के योग्य। खुशी है कि मैंने और नीचे देखा क्योंकि बहुत अधिक ऊँचाई वाली अन्य प्रविष्टियाँ काम नहीं कर रही थीं और फॉर्मडेटा () हमारे उद्देश्यों के लिए चाल नहीं चलेगी। बहुत बढ़िया!
user1585204

9
प्रश्न फ़ाइल पथ के लिए पूछ रहा है फ़ाइल सामग्री नहीं।
क्वेंटिन

@ क्वेंटिन: हाँ आप सही हैं, लेकिन ओपी का इरादा साफ है कि वह किसी तरह फाइल को सर्वर पर अपलोड कर सके। इस प्रकार यह समाधान निश्चित रूप से उन सभी लोगों के लिए बहुत उपयोगी होगा जो जेएस का उपयोग करके सर्वर पर फ़ाइलों को अपलोड करने का एक तरीका खोजते हैं।
user18490

36

यदि आप Internet Explorer, उपकरण, इंटरनेट विकल्प, सुरक्षा, कस्टम पर जाते हैं, तो "सर्वर पर फ़ाइलें अपलोड करते समय स्थानीय निर्देशिका पथ शामिल करें" (यह काफी तरीके से नीचे है) ढूंढें और "सक्षम करें" पर क्लिक करें। यह काम करेगा


2
क्या क्रोम के समान कुछ है?
ज़ेवेन ज़रायन

11

मुझे खुशी है कि ब्राउज़र हमें घुसपैठ की स्क्रिप्ट और इस तरह से बचाने के लिए परवाह करते हैं। मैं IE को ब्राउज़र में कुछ डालने से खुश नहीं हूँ जो एक साधारण स्टाइल-फ़िक्स को हैक-अटैक जैसा बनाता है!

मैंने फ़ाइल-इनपुट का प्रतिनिधित्व करने के लिए एक <span> का उपयोग किया है ताकि मैं <div> के बजाय <div> (एक बार फिर IE के कारण) उपयुक्त स्टाइलिंग लागू कर सकूं। अब इस वजह से IE चाहता है कि उपयोगकर्ता को एक मान दिखाने के लिए एक रास्ता है जो सिर्फ उन्हें गार्ड पर रखने की गारंटी देता है और बहुत कम आशंका में है (यदि पूरी तरह से उन्हें डरा नहीं!) ... अधिक IE-CRAP!

किसी भी तरह, उन लोगों के लिए धन्यवाद जिन्होंने यहां स्पष्टीकरण पोस्ट किया है: IE ब्राउज़र सुरक्षा: इनपुट में पथ पथ के लिए "नकली" को लागू करना [प्रकार = "फ़ाइल"] , मैंने एक साथ एक मामूली फिक्सर-अपर डाल दिया है ...

नीचे दिया गया कोड दो चीजें करता है - यह एक lte IE8 बग को ठीक करता है जहां अपलोड क्षेत्र के onBlur तक onChange घटना में आग नहीं लगती है और यह एक साफ फाइलपथ के साथ एक तत्व को अपडेट करता है जो उपयोगकर्ता को डरा नहीं देगा।

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

कृपया ध्यान दें कि यह IE पर काम नहीं करता है, इसलिए; मैंने निम्नलिखित को प्रतिस्थापित किया: filePath.substring (filePath.lastIndexOf ('\\') + 1, filePath.length:
बासेल ख

6

मैं उसी समस्या को लेकर आया था। IE8 में फ़ाइल इनपुट नियंत्रण के बाद एक छिपा इनपुट बनाकर काम किया जा सकता है। इसके पिछले सिबलिंग के मान से इसे भरें। IE9 में यह अस्वस्थ निर्धारित किया गया है।

पूरा रास्ता जानने की चाह में मेरा कारण अपलोड करने से पहले एक जावास्क्रिप्ट छवि पूर्वावलोकन बनाना था। अब मुझे चयनित छवि का पूर्वावलोकन बनाने के लिए फ़ाइल अपलोड करनी होगी।


1
अगर कोई अपलोड करने से पहले कोई चित्र देखना चाहता है, तो वे इसे अपने कंप्यूटर पर देख सकते हैं।
mbomb007

4

यदि आपको वास्तव में uploded फ़ाइल का पूर्ण पथ भेजने की आवश्यकता है, तो आपको संभवतः एक साइन किए गए जावा एप्लेट की तरह कुछ का उपयोग करना होगा क्योंकि यह जानकारी प्राप्त करने का कोई तरीका नहीं है यदि ब्राउज़र इसे नहीं भेजता है।


How to fullpath original path <input type = "file" accept = "। jpeg, .jpg, .png">। मुझे नकली रास्ता मिल रहा है, इसे कैसे फिर से देखें
गोविंद शर्मा

1

ऐसा लगता है कि आप js द्वारा लोकलहोस्ट में पूरा रास्ता नहीं खोज सकते, लेकिन आप फ़ाइल नाम दिखाने के लिए फर्जीवाड़ा छिपा सकते हैं। पथ के बिना फ़ाइल इनपुट के चयनित फ़ाइल नाम को प्राप्त करने के लिए jQuery का उपयोग करें


1

फ़ाइल पाठकों का उपयोग करें:

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

हाय, मेरे मामले में मैं asp.net विकास के वातावरण का उपयोग कर रहा हूं, इसलिए मैं उन डेटा को एसिंक्रोनस एजैक्स अनुरोध में अपलोड करना चाहता था, [webMethod] में आप फ़ाइल अपलोडर को नहीं पकड़ सकते क्योंकि यह स्थिर तत्व नहीं है, इसलिए मुझे करना पड़ा रास्ते को ठीक करके इस तरह के समाधान के लिए टर्नओवर करें, डीबी में इसे बचाने के लिए वांछित छवि को बाइट में परिवर्तित करें।

यहाँ मेरा जावास्क्रिप्ट फ़ंक्शन है, आशा है कि यह आपकी मदद करता है:

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

यहाँ केवल परीक्षण के लिए:

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

-3

सरदेश शर्मा के जवाब का उपयोग करते हुए:

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

पूरे रास्ते के लिए।


यह undefinedमुझे FireFox 75.0 में देता है। करता है pathवास्तव में मौजूद? क्या आपके पास इसके बारे में प्रलेखन का कोई संदर्भ है?
जोस मैनुअल अबर्का रोड्रिगेज

1
नमस्ते! मैंने स्वयं समस्या का समाधान करने और पथ का उपयोग करने में सफल होने के बाद यह उत्तर पोस्ट किया। मुझे याद नहीं है कि मैं किस प्रोजेक्ट में यह कोशिश कर रहा था, लेकिन मैं हमेशा Google Chrome का उपयोग करता हूं, शायद यह समाधान केवल उस ब्राउज़र के लिए उपयुक्त है। और यह ब्राउज़र अपडेट के कारण अप्रचलित भी हो सकता है। आगे मदद करने में असमर्थ होने के लिए क्षमा करें: /
लोडरन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.