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

これが私の問題を解決するJavaScriptです。しかし、アラートの値では、

C:\fakepath\test.csv 

そしてMozillaは私にくれます:

test.csv

しかし、ローカルの完全修飾ファイルパスが必要です。この問題を解決するには?

これがブラウザのセキュリティ問題が原因である場合、これを行う別の方法は何ですか?


41
これはブラウザのセキュリティ実装です。ブラウザはディスク構造へのアクセスを防止しています。フルパスが必要な理由を説明できれば役立つ場合があります。
Stuart

1
完全なURLとはどういう意味ですか?アップロードされたファイルのアドレス?
gor

4
ちなみに、IEはパスが「期待」されているサーバーが壊れることを望まないため、IEは「fakepath」ビットのみを提供します。それ以外の場合は、セキュリティ上の理由から他のブラウザと同じように、ファイル名のみを取得します(パスはありません)。さらに重要なのは、悪意のある意図がない限り、パスを知っていると役立つ理由がわかりません。
scunliffe 2011年

2
browser security issue〜そのは、(当然のように)それは非常に低いです、あなたがそれを回避することができ、ブラウザに実装されている場合
ロス

13
Gosh darnit、私はすべてのファイルをに保管しているC:\fakepathので、誰もが私のディレクトリ構造を知っています。
mbomb007 2018

回答:


173

一部のブラウザには、JavaScriptがファイルのローカルフルパスを認識できないようにするセキュリティ機能があります。それは理にかなっています-クライアントとして、あなたはサーバーにあなたのローカルマシンのファイルシステムを知らせたくないでしょう。すべてのブラウザがこれを行うとよいでしょう。


9
ブラウザがローカルファイルパスを送信しない場合、それを見つける方法はありません。
ペッテリヒエタビルタ2011年

47
フォームを投稿するだけです。ブラウザがアップロードを処理します。あなたのウェブサイトはクライアントに戻るフルパスを知る必要はありません。
Rup

2
@ruffpアップロードできるのは投稿のみなので、アップロードをフォームに入れて送信する必要があります。それでも、標準のファイルアップロードコントロールを使用してファイルを選択するため、クライアントの完全なファイル名は必要ありません。
Rup

6
FlashやJavaのような信頼できるプラグインがなければ、通常のウェブサイトがローカルマシンに対して悪意のあることは何でもないと思います。それはプライバシーの問題です。たとえば、デスクトップからアップロードする場合は、ローカルマシンまたはドメイン(c:\users\myname\desktopまたは/Users/myname/Desktop/その他)のユーザー名をサーバーに通知します。これは、Webサーバーがビジネスについて知っていることではありません。
Joe Enos 2013年

8
情報は誰かに対して使用される可能性があるため、プライバシーはほとんど常にセキュリティと脆弱性に関係しています。攻撃は頻繁に複数の問題を悪用して目標を達成します。危険を認識していない人は、Hello World以外のコードの近くでは、パラノイア方法に関する追加のワークショップをせずに許可されるべきではありません。
Archimedix

70

使用する

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

の代わりに

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

16
Chrome 44.0.2403.125では、これはファイル名のみを提供します。
ギャップ

4
次に、document.getElementById( "file-id")。files [0] .pathを使用します。私にとってはうまくいきます。
Loaderon、2018

@Loaderonに感謝します。これを回答として投稿してください。
7geeky 2018年

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

これがlocalhostで機能しない理由は何ですか?ソースはsrc = "C:\ fakepath \ filename.jpg"として設定されますが、console.logingの画像要素により、srcはdataURLと表示されます
galki

回答:バックボーンの再レンダリング:/
galki

1
このエントリがどれだけのフラストレーションを保存したかはわかりません。それは大まかなダイヤモンドです...賛成票はわずか12票ですが、それ以上の価値があります。はるかに高い賛成票を持つ他のエントリが機能せず、FormData()も目的にかなわないため、さらに下を見下ろして良かったです。よくやった!
user1585204 2017年

9
問題は、ファイルの内容ではなくファイルのパスを要求することです。
クエンティン

@クエンティン:はい、そうですが、OPの目的は、おそらくファイルをサーバーにアップロードできるようにすることです。したがって、このソリューションは、JSを使用してサーバーにファイルをアップロードする方法を探しているすべての人にとって確かに非常に役立ちます。
user18490 2017

36

Internet Explorer、[ツール]、[インターネットオプション]、[セキュリティ]、[カスタム]に移動する場合は、[サーバーにファイルをアップロードするときにローカルディレクトリパスを含める]を見つけ(かなり下にあります)、[有効にする]をクリックします。これは動作します


2
Chromeに似たものはありますか?
Zaven Zareyan

11

ブラウザが煩わしいスクリプトなどから私たちを救ってくれることを嬉しく思います。IEがブラウザーに何かを入れて、単純なスタイル修正をハック攻撃のように見せることに不満があります!

<入力>の代わりに<分割>に適切なスタイルを適用できるように、ファイル入力を表すために<スパン>を使用しました(もう一度、IEのため)。さて、このIEが原因で、ユーザーに警戒を怠らず最低限の不安を払うことが保証されている値を持つパスを表示したいと考えています(完全に怖がらせない限り!)。詳細IE-CRAP!

とにかく、ここに説明を投稿した人々に感謝します: IEブラウザーのセキュリティ:input [type = "file"]のファイルパスに "fakepath"を追加して、マイナーなフィクサーアッパーをまとめました...

以下のコードは2つのことを実行します。これは、アップロードフィールドのonBlurまでonChangeイベントが発生せず、ユーザーを怖がらせないクリーンなファイルパスで要素を更新するという、IE8のバグを修正します。

// 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)
Bassel Kh

6

私は同じ問題に遭遇しました。IE8では、ファイル入力コントロールの後に隠し入力を作成することで回避できます。これを前の兄弟の値で埋めます。IE9では、これも修正されています。

フルパスを知りたい理由は、アップロードする前にJavaScript画像のプレビューを作成するためでした。次に、ファイルをアップロードして、選択した画像のプレビューを作成する必要があります。


1
誰かがアップロード前に画像を見たい場合、彼らは自分のコンピュータでそれを見ることができます。
mbomb007 2018

4

アップロードされたファイルの完全なパスを送信する必要がある場合は、ブラウザーが送信しない場合にこの情報を取得する方法がないため、おそらく署名されたJavaアプレットのようなものを使用する必要があります。


元のパスをフルパスする方法<input type = "file" accept = "。jpeg、.jpg、.png">。i偽のパスを取得する方法、それを再愛する方法
Govind Sharma


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開発環境を使用しているので、これらのデータを非同期のajaxリクエストでアップロードしたかったのですが、[webMethod]では静的要素ではないため、ファイルアップローダーをキャッチできません。パスを修正することにより、このようなソリューションの回転率を上げ、必要な画像をバイトに変換してDBに保存します。

これが私のJavaScript関数です。

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

Sardesh Sharmaの回答の使用を補足する:

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

フルパス。


これはundefinedFireFox 75.0で私に戻ります。path実際に存在しますか?それに関するドキュメントへの参照はありますか?
ホセ・マヌエルアバルカロドリゲス

1
こんにちは!私は自分で問題を解決しようとし、パスを使用して成功した後、この回答を投稿しました。どのプロジェクトでこれを試したか覚えていませんが、私は常にGoogle Chromeを使用しています。おそらく、このソリューションはそのブラウザーにのみ適しています。また、ブラウザの更新により、古くなった可能性もあります。これ以上のサポートができず申し訳ありません:/
Loaderon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.