C: \ fakepath nasıl çözülür?


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

Bu benim yükleme düğmem.

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

Bu dosyanın tam yolunu göstermek zorunda olduğum metin alanıdır.

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

Bu, sorunumu çözen JavaScript. Ama uyarı değerinde bana

C:\fakepath\test.csv 

ve Mozilla bana şunu veriyor:

test.csv

Ama yerel tam nitelikli dosya yolunu istiyorum . Bu sorunu nasıl çözebilirim?

Bu tarayıcı güvenlik sorunundan kaynaklanıyorsa, bunu yapmanın alternatif yolu ne olmalıdır?


41
Bu, tarayıcının güvenlik uygulamasıdır - tarayıcı sizi disk yapınıza erişmeye karşı korur. Tam yolu neden istediğini açıklayabilirsen yardımcı olabilir.
Stuart

1
Tam URL ile ne demek istiyorsun ? Yüklenen dosyanın adresi?
gor

4
Kayıt için, IE sadece "fakepath" bitini verir çünkü yolun kesilmesini "bekleyen" sunucular istemiyorlardı. Aksi takdirde, güvenlik nedeniyle diğer tarayıcılarda olduğu gibi yalnızca dosya adını alırsınız (yol yok). Daha da önemlisi, kötü niyetli niyetleriniz yoksa, yolu bilmenin neden faydalı bir şey sağladığını göremiyorum.
scunliffe

2
browser security issue~ eğer tarayıcıda uygulanmışsa (haklı olarak) o zaman onu atlatabilirsin
Ross

13
Tanrım darnit, bütün dosyalarımı saklıyorum, C:\fakepathşimdi herkes dizin yapımı biliyor.
mbomb007

Yanıtlar:


173

Bazı tarayıcılarda, JavaScript'in dosyanızın yerel tam yolunu bilmesini engelleyen bir güvenlik özelliği bulunur. Bu mantıklıdır - istemci olarak sunucunun yerel makinenizin dosya sistemini bilmesini istemezsiniz. Tüm tarayıcılar bunu yapsaydı iyi olurdu.


9
Tarayıcı yerel dosya yolunu göndermezse, bunu bulmanın bir yolu yoktur.
Petteri Hietavirta

47
Sadece formu gönderin: tarayıcı yüklemeyi halledecektir. Web sitenizin istemcideki tam yolu bilmesine gerek yoktur.
Rup

2
@ruffp Yüklemeyi bir forma koyup göndermeniz için yalnızca bir gönderi yükleyebilirsiniz. Bu, dosyayı seçmek için standart bir dosya yükleme denetimi kullanmaya devam eder ve tam istemci dosya adına ihtiyacınız olmayacaktır.
Rup

6
Flash veya Java gibi bir tür güvenilir eklenti olmadan normal bir web sitesinin yerel makinenize yapabileceği kötü amaçlı bir şey olduğundan şüpheliyim. Bu daha çok mahremiyet. Örneğin, masaüstünüzden Sen yükleme varsa, sunucu yerel makine veya etki (kullanıcı adınızı bildirerek olurdum c:\users\myname\desktopya /Users/myname/Desktop/ya da her neyse). Bu bir web sunucusunun bildikleri bir şey değil.
Joe Enos

8
Gizlilik neredeyse her zaman güvenlik ve güvenlik açığıyla ilgilidir, çünkü bilgi birisine karşı kullanılabilir. Saldırılar, hedeflerine ulaşmak için sık sık birden fazla sorundan yararlanır. Tehlikeleri tanımayan kimseye, nasıl yapılır paranoyak atölyeleri olmadan Merhaba Dünya dışındaki kodların yakınında izin verilmemelidir.
Archimedix

70

kullanım

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

onun yerine

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

16
Chrome 44.0.2403.125'te, bu yalnızca dosya adını sağlar.
boşluk

4
Ardından document.getElementById ("dosya kimliği"). Dosyalarını [0] .path kullanın. Benim için iyi çalışıyor.
Loaderon

Teşekkürler @Loaderon bunu bir cevap olarak göndermelisin!
7geeky

45

onchangeGirdi dosya türü için girdi olayında FileReader nesnesini kullanıyorum ! Bu örnek, readAsDataURL işlevini kullanır ve bu nedenle bir etiketinizin olması gerekir. FileReader nesnesi ayrıca ikili verileri almak için readAsBinaryString'e sahiptir; bunlar daha sonra sunucunuzda aynı dosyayı oluşturmak için kullanılabilir

Misal:

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

bunun neden localhost üzerinde çalışmadığına dair bir fikrin var mı? kaynak src = "C: \ fakepath \ filename.jpg" olarak ayarlanır ancak resim öğesini console.logging, src'nin bir data olduğunu söylüyorURL
galki

cevap: omurga
rendendering

1
Bu girişin ne kadar hayal kırıklığına uğradığı hakkında hiçbir fikriniz yok. Kaba bir elmas ... sadece 12 oy ama çok daha fazlasını hak ediyor. Çok daha yüksek upvotes ile diğer girişler çalışma değildi ve ayrıca FormData () bizim amaçlarımız için hile yapmaz çünkü sevindim aşağıya baktı. Aferin!
user1585204

9
Soru dosya içeriğini değil dosya yolunu sormaktır.
Quentin

@Quentin: evet haklısınız, ancak açıkça OP'nin amacı bir şekilde dosyayı sunucuya yükleyebilmektir. Böylece bu çözüm işe yarayacak JS kullanarak bir sunucuya dosya yüklemek için bir yol arayan tüm insanlar için çok yararlıdır.
user18490

36

Internet Explorer, Araçlar, Internet Seçeneği, Güvenlik, Özel'e giderseniz, "Dosyaları bir sunucuya yüklerken yerel dizin yolunu dahil et" i bulun (oldukça düşük bir yöntemdir) ve "Etkinleştir" i tıklayın. Bu çalışacak


2
Chrome'a ​​benzer bir şey var mı?
Zaven Zareyan

11

Tarayıcıların bizi müdahaleci komut dosyalarından ve benzerlerinden kurtarmaya özen gösterdiği için mutluyum. Ben bir saldırı saldırı gibi basit bir stil düzeltme yapan tarayıcıya bir şey koyarak IE memnun değilim!

Dosya girişini temsil etmek için <span> kullandım, böylece <input> yerine <div> 'a uygun stil uygulayabilirim (IE'den bir kez daha). Şimdi bu IE nedeniyle Kullanıcı sadece nöbet ve en azından endişeli onları koymak için garanti edilen bir değer ile bir yol göstermek istiyorum (tamamen korkutmak değil mi?!) ... DAHA IE-CRAP!

Her neyse, açıklamayı buraya gönderenler sayesinde: IE Tarayıcı Güvenliği: Girişe [type = "file"] dosya yoluna "fakepath" ekleyerek , küçük bir fixer-üst koydum ...

Aşağıdaki kod iki şey yapar - yükleme alanının onBlur'una kadar onChange olayının başlatılmadığı bir lte IE8 hatasını düzeltir ve kullanıcıyı korkutmayacak temizlenmiş bir dosyayoluyla bir öğeyi günceller.

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

Bunun IE üzerinde çalışmadığını lütfen unutmayın; Aşağıdakileri değiştirdim: filePath.substring (filePath.lastIndexOf ('\\') + 1, filePath.length)
Bassel Kh

6

Aynı sorunla karşılaştım. IE8'de, dosya giriş denetiminden sonra gizli bir girdi oluşturularak geçici olarak çözülebilir. Bunu önceki kardeşinin değeri ile doldurun. IE9'da bu da düzeltildi.

Tam yolu tanımak istememin sebebi, yüklemeden önce bir javascript resim önizlemesi oluşturmaktı. Şimdi seçilen görüntünün önizlemesini oluşturmak için dosyayı yüklemeliyim.


1
Birisi yüklemeden önce bir resim görmek istiyorsa, görüntüyü bilgisayarında görüntüleyebilir.
mbomb007

4

Yükseltilmiş dosyanın tam yolunu gerçekten göndermeniz gerekiyorsa, tarayıcı göndermezse bu bilgiyi almanın herhangi bir yolu olmadığından muhtemelen imzalı bir java uygulaması gibi bir şey kullanmanız gerekir.


orijinal yolun tam yolunu girme <input type = "file" accept = ". jpeg, .jpg, .png">. Sahte yol alıyorum, nasıl yeniden gönderilir
Govind Sharma


1

Dosya okuyucuları kullanın:

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

Hy orada, benim durumumda asp.net geliştirme ortamı kullanıyorum, bu yüzden asynchronus ajax isteğinde bu verileri yüklemek istedim, [webMethod] statik öğe olmadığından dosya yükleyiciyi yakalayamıyorum, bu yüzden yolu sabitleyerek böyle bir çözüm için bir ciro yapın, daha sonra istenen görüntüyü DB'ye kaydetmek için baytlara dönüştürün.

İşte benim javascript işlevi, size yardımcı olacağını umuyoruz:

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

burada sadece test için:

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

-3

Sardesh Sharma'nın cevap kullanımını tamamlamak:

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

Tam yol için.


Bu undefinedFireFox 75.0'da bana geri dönüyor . Mu pathgerçekten var? Bununla ilgili belgelere referansınız var mı?
Jose Manuel Abarca Rodríguez

1
Selam! Bu cevabı kendim çözmeye çalıştıktan ve yolu kullanarak başarılı olduktan sonra gönderdim. Hangi projede bunu denediğimi hatırlamıyorum, ancak her zaman Google Chrome kullanıyorum, belki de bu çözüm sadece o tarayıcı için uygundur. Tarayıcı güncellemeleri nedeniyle artık kullanılmamış olabilir. Daha fazla yardım edemediğim için üzgünüm: /
Loaderon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.