<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
しかし、ローカルの完全修飾ファイルパスが必要です。この問題を解決する方法
これがブラウザのセキュリティ問題によるものであれば、これを代替する方法は何でしょうか。
一部のブラウザには、JavaScriptがファイルのローカルのフルパスを認識できないようにするセキュリティ機能があります。それは理にかなっています - クライアントとして、あなたはサーバにあなたのローカルマシンのファイルシステムを知らせたくありません。すべてのブラウザでこれを行えばいいでしょう。
つかいます
document.getElementById("file-id").files[0].name;
の代わりに
document.getElementById('file-id').value
Internet Explorer、ツール、インターネットオプション、セキュリティ、カスタムの順に選択した場合は、「サーバーにファイルをアップロードするときにローカルディレクトリパスを含める」を見つけ(かなり下がっています)、「有効にする」をクリックします。これはうまくいくでしょう
私はあなたの入力ファイルタイプのための入力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;
}
ブラウザが私たちを煩わしいスクリプトなどから守ってくれることを嬉しく思います。 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);
私は同じ問題に出会った。 IE8では、ファイル入力コントロールの後に隠し入力を作成することで回避できます。これを前の兄弟の値で埋めます。 IE9ではこれも修正されています。
フルパスを知りたいのは、アップロードする前にJavaScriptのイメージプレビューを作成するためでした。選択した画像のプレビューを作成するためにファイルをアップロードする必要があります。
アップロードしたファイルのフルパスを本当に送信する必要がある場合は、ブラウザから送信されない場合はこの情報を取得する方法がないため、署名付きJavaアプレットのようなものを使用する必要があります。
jsでlocalhostのフルパスを見つけることはできないようですが、偽のパスを隠してファイル名だけを表示することもできます。 パスなしでファイル入力の選択されたファイル名を取得するにはjQueryを使います
Sardesh Sharmaの答えの使用を補完する:
document.getElementById("file-id").files[0].path
フルパス用。
ああ、私の場合私は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
ファイルリーダーを使う:
$(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 + ")" });
}
}