web-dev-qa-db-ja.com

jQueryを使用してファイルをダウンロードする

ユーザーがリンクをクリックしたときに、ダウンロードを促す方法はありますか。

たとえば、次の代わりに:

<a href="uploads/file.doc">Download Here</a>

私が使用できます:

<a href="#">Download Here</a>

 $('a').click... //Some jquery to download the file

このように、Googleは私のHREFとプライベートファイルのインデックスを作成しません。

これはjQueryで実行できますか?または、これをPHPまたは何かで行う必要がありますか?

104
Dodinas

preventDefault を使用して、これをより優雅に劣化させるソリューションとして提案するかもしれません。

$('a').click(function(e) {
    e.preventDefault();  //stop the browser from following
    window.location.href = 'uploads/file.doc';
});

<a href="no-script.html">Download now!</a>

Javascriptがなくても、少なくともこの方法でユーザーはフィードバックを得ることができます。

153
karim79

検索エンジンで特定のファイルのインデックスを作成したくない場合は、 robots.txt を使用して、WebスパイダーにWebサイトの特定の部分にアクセスしないように指示できます。

JavaScriptのみに依存している場合、JavaScriptなしで閲覧する一部のユーザーはリンクをクリックできません。

22
Rob

検索エンジンからファイルを隠すための多くの方法を示す素敵な記事があります:

http://antezeta.com/news/avoid-search-engine-indexing

JavaScriptは、ページのインデックスを作成しない良い方法ではありません。ユーザーがファイルに直接リンクすることを妨げることはなく(したがって、クローラーに公開することもありません)、Robが述べたように、すべてのユーザーに対して機能するわけではありません。
簡単な修正方法は、rel="nofollow"属性を追加することです。ただし、robots.txtがないと完了しません。

<a href="uploads/file.doc" rel="nofollow">Download Here</a>
18
Kobi

はい、window.location.hrefをダウンロードするファイルのURLに変更する必要があります。

window.location.href = 'http://www.com/path/to/file';
11
MacAnthony
 var link=document.createElement('a');
 document.body.appendChild(link);
 link.href=url;
 link.click();
8

window.location.href = 'uploads/file.doc';と記述することで、ファイルの保存場所を示します。もちろん、.htacessを使用して、保存されたファイルに必要な動作を強制することもできますが、これは必ずしも手間がかかるとは限りません。

サーバー側のphpファイルを作成し、このコンテンツをその中に配置することをお勧めします。

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$_REQUEST['f']);
readfile('../some_folder/some_subfolder/'.$_REQUEST['f']); 
exit;

このコードは、実際にどこに保存したかを示すことなく、すべてのファイルをダウンロードとして返します。

このphpファイルをwindow.location.href = 'scripts/this_php_file.php?f=downloaded_file';経由で開きます

6
Otvazhnii
  • JQuery関数を使用する

        var valFileDownloadPath = 'http//:'+'your url';
    
       window.open(valFileDownloadPath , '_blank');
    

非表示のiframe が役立ちます

3
letronje

Clickdownイベントの前に呼び出されるmousedownイベントを使用することをお勧めします。このようにして、ブラウザはクリックイベントを自然に処理し、コードの奇妙さを回避します。

(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);
2
ling

JQueryを使用したフォームのクリアに関する同様の投稿については、こちらを参照してください。 jQueryを使用したマルチステージフォームのリセット

また、値がstruts値スタックによって再入力されるという問題に直面している可能性があります。つまり、フォームを送信し、アクションクラスで何でもしますが、アクションクラスの関連フィールド値はクリアしません。このシナリオでは、フォームは以前に送信した値を保持しているように見えます。これらを何らかの方法で永続化する場合は、永続化後、SUCCESSを返す前に、アクションクラスの各フィールド値をnullにします。

0