3

これは似ています: JavaScript を使用してファイルを開くには?

目標: 画像のダブルクリックでファイルを取得/開く

function getFile(filename){
   // setting mime this way is for example only
   var mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
   
   jQuery.ajax({ url      : 'get_file.pl',
                 data     : {filename:filename}, 
                 success  : function(data){
                               var win = window.open('','title');
                               win.document.open(mime);
                               win.document.write(data);
                               win.document.close();
                            }
               });
}

jQuery('#imgID').dblclick(function(){ 
   getFile('someFile.docx');
});

私は頭の中でこれを行っていますが、上記はテキストファイルでは機能しますが、バイナリでは機能しないと思います。これを適切に行うプラグインはありますか?ファイルをダウンロードするのではなく、ブラウザー (またはアプリケーション) で開くのが理想的ですが、それが夢だとは思えません。保存/開くダイアログでファイルをダウンロードする必要がある場合は、それで問題ありません。


編集:

言及するのを忘れていた情報の 1 つは、これを POST 要求にしたいということです。これが、私が最初に AJAX を検討していた理由の一部です。フォーム/iframe を作成して同様のことを行う回避策を見てきましたが、返された情報のより良いハンドラーを探していました。

4

1 に答える 1

5

AJAX経由でこれを行う理由はないように思えます。get_file.pl?filename=...の新しいウィンドウを開いて、ブラウザに処理させてください。ユーザーがget_file.plContent-Typeによって送信されたファイルを処理できるプラグインを持っている場合、ファイルが表示されます。それ以外の場合は、他のファイルと同様にダウンロードする必要があります。

function getFile(filename) {
   window.open('get_file.pl?filename=' + filename,'title');
}

jQuery('#imgID').dblclick(function() { 
   getFile('someFile.docx');
});

編集POST:スクリプトを作成したい場合は、いくつかのハッカーでそれを行うことができます<form>

function getFile(filename) {
    var win = 'w' + Math.floor(Math.random() * 10000000000000);
    window.open('', win,'width=250,height=100');
    var f = $('<form></form>')
            .attr({target: win, method:'post', action: 'get_file.pl'})
            .appendTo(document.body);

    var i = $('<input>')
            .attr({type:'hidden',name:'filename',value:filename})
            .appendTo(f);

    f[0].submit();
    f.remove();
}

もちろん、開発者ツールを使用して「詮索好きな目」からデータを隠すことは不可能であるため、これはややばかげています。ファイル名が本当に重要な場合は、クライアントにアクセス トークンを発行し、サーバー スクリプトでデータを検索します。

于 2012-06-12T23:09:42.347 に答える