web-dev-qa-db-ja.com

C:\ fakepathを解決する方法は?

<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

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

これがブラウザのセキュリティ問題によるものであれば、これを代替する方法は何でしょうか。

214
e_maxm

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

155
Joe Enos

つかいます

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

の代わりに

document.getElementById('file-id').value
56
Sardesh Sharma

Internet Explorer、ツール、インターネットオプション、セキュリティ、カスタムの順に選択した場合は、「サーバーにファイルをアップロードするときにローカルディレクトリパスを含める」を見つけ(かなり下がっています)、「有効にする」をクリックします。これはうまくいくでしょう

37
saikiran1043

私はあなたの入力ファイルタイプのための入力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;
}
34
chakroun yesser

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

ファイル入力を表すために<span>を使用したので、<IE>のために<input>ではなく<div>に適切なスタイルを適用できます。これが原因で、IEは、ユーザーを保護し、最も不安にならないようにすることが保証されている値のパスをユーザーに表示することを望んでいます。 -CRAP!

とにかく、ここに説明を投稿した人たちのおかげで: IEブラウザのセキュリティ:入力のファイルパスに "fakepath"を追加する[type = "file"] 、マイナーフィクサー - アッパーをまとめました...

以下のコードは2つのことをします - それはアップロードフィールドのonBlurまでonChangeイベントが発生せず、それがUserを怖がらせないきれいなファイルパスで要素を更新するというlte 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);
11
Anand Sharma

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

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

6
Telefoontoestel

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

3
jcoder

jsでlocalhostのフルパスを見つけることはできないようですが、偽のパスを隠してファイル名だけを表示することもできます。 パスなしでファイル入力の選択されたファイル名を取得するにはjQueryを使います

1
Zernel

Sardesh Sharmaの答えの使用を補完する:

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

フルパス用。

0
Loaderon

ああ、私の場合私はasp.net開発環境を使っています、それで私は非同期のajaxリクエストでそれらのデータをアップロードしたいと思いました、それは静的要素ではないので私は必要な画像をバイトに変換して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
0
Shiva Brahma

ファイルリーダーを使う:

$(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 + ")" });

        }
    }
0
Marcos Di Paolo