2017-11-29 8 views
1

私は "Filedownload.save"を使ってZkでファイルをダウンロードしますが、問題があります。ZK8 Filedownload.saveファイル名をカット

ZKは、linemaは「FISH番号のCH​​IPS.pdfは」、「FISH.pdf」

誰もがそれを解決する方法を知っているとして、ファイルdowloadある場合など、一部の文字で私のファイル名を切りますか?

UPDATE:

私は指示に従っており、私は最終的に見サーバの応答、このJSON:

{ "RS":[[ "ダウンロード"、[ "/て、myApp/zkau /ビュー/z_aq5/dwnmed-3/son/FISH#CHIPS.pdf"]],"rid":9}

私は今、紛失しています。クライアント側でこのJSONを使用するとどうなりますか?

+0

に含まれるのでしょうか? –

+0

ChromeとFirefox – Ildelian

+0

ええ、Microsoftの問題だと思っていましたが、一般的な問題です。応答を追加してくれてありがとう、それは私に私の答えのための正しいアイデアを与えた。 –

答えて

2

公式ZK-バグは、サーバー側の回避策は以下のとおりです。ZK-3809

として追跡されていますに... ...

Filedownload.save("test content", "text/plain", "test#test.txt"); 

など

分割ダウンロードコード..

AMedia media = new AMedia("test#test.txt", "txt", "text/plain", "test content"); 
Clients.response(new AuDownload((DeferredValue)() -> 
    Executions.getCurrent().getDesktop().getDownloadMediaURI(
     media, "test#test.txt").replace("#", "%23"))); 

...必要に応じて特殊文字をエンコードできるようにします。


UPDATE:ZK-3809が固定されており、ファイルをダウンロードするために使用しているブラウザZKバージョン8.5.1

1

問題は、#が、URLで有効であるが特別な方法で扱われる「予約文字」の1つであることです。詳細はthis questionをご覧ください。私の推測では、#の後のすべてがinterpreted as a fragment on the pageなので、この場合は無視されます。

#%23に置き換えるなど、これを修正する方法があります。しかし、Filedownload.saveを呼び出すときにサーバ側でこれを行うと、ファイル名は文字通りFISH%23CHIPS.pdfに変更されます。

代わりに、表示された応答が到着したときにファイルをダウンロードするクライアント側の方法を傍受することができます。このようにして、zkはファイルに通常の名前を与え、ダウンロードだけがURLをサニタイズします。これをスクリプトタグまたはロードされたjsファイルに追加します。

zk.afterLoad('zk', function() { 
    var oldMethod = zAu.cmd0.download; 
    zAu.cmd0.download = function(filename) { 
     return oldMethod(filename.replace(new RegExp('#', 'g'), '%23')); 
    } 
}); 

次に、完全な名前でファイルをダウンロードします。あなたは余分な時間を費やして、他の予約文字を浄化したいかもしれません。正しいコードについてはthis wiki article about "percent encoding"をお読みください。

私はもzkで提出しています。これは、クライアント側の方法ですぐに処理する必要があると思います。

+0

あなたの答えはMalteに感謝しますが、私は "公式"のソリューションを実装しました。 – Ildelian

+0

これで問題は解決しました。このようにして、内部的にパッチを当てるまではすでに修正済みです。この修正を私たちのコードにも適用します; D –

関連する問題