0

配列バッファーの ajax 応答によって画像コンテンツを取得しました。その配列バッファーを blob builder に追加しました。これらのコンテンツをファイルに書き込みたいと思います。これを行う方法はありますか? 私はwindows.requestFileSystemを使用しましたが、クロムでは正常に動作していますが、mozillaでは動作していません..ここに私のコードがあります、

関数 retrieveImage(studyUID, seriesUID, instanceUID, sopClassUID,nodeRef) {

     window.requestFileSystem = window.requestFileSystem||window.webkitRequestFileSystem;
var xhr = new XMLHttpRequest();
var url="/alfresco/createthumbnail?ticket="+ticket+"&node="+nodeRef;
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';

xhr.onload = function(e) {
    if(this.status == 200) {
        window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
            var fn = '';
            if(sopClassUID == '1.2.840.10008.5.1.4.1.1.104.1') {
                fn = instanceUID+'.pdf';
            } else {
                fn = instanceUID+'.jpg';
            }

                    fs.root.getFile(fn, {create:true}, function(fileEntry) {
                     fileEntry.createWriter(function(writer) {
                     writer.onwriteend = function(e) {
                        console.log(fileEntry.fullPath + " created");

                    }
                    writer.onerror = function(e) {
                        console.log(e.toString());
                    }

                    var bb;
                    if(window.BlobBuilder) {
                        bb = new BlobBuilder();
                    } else if(window.WebKitBlobBuilder) {
                        bb = new WebKitBlobBuilder();
                    }
                    bb.append(xhr.response);

                    if(sopClassUID == '1.2.840.10008.5.1.4.1.1.104.1') {
                        writer.write(bb.getBlob('application/pdf'));
                    } else {
                        writer.write(bb.getBlob('image/jpeg'));
                    }
                }, fileErrorHandler);
            }, fileErrorHandler);
        }, fileErrorHandler);
    }
};
xhr.send();

}

4

2 に答える 2

1

Web ページのスクリプトは、[pdfs などの] 任意のファイルをクライアントのストレージに書き込むことはできません。そして、それはウェブページがあなたのマシンにマルウェアを入れようとするのに苦労していることを意味するので、あなたは感謝すべきです.

代わりに、ブラウザがダウンロードしたいコンテンツを見つけられる URL にユーザーをリダイレクトする (または新しいウィンドウ/タブを開く) 必要があります。ヘッダーを使用して、ダウンロードするか、ここで説明されているように表示するようにクライアントに指示します。

ダウンロードしたコンテンツを動的に作成する必要がある場合は、それをサーバー上で管理して、アクティブなページ (.php、.jsp、.aspx など) にします。重要なのは、応答のヘッダーに正しい MIME タイプを含めることです。

注: はい、私は ajax を使用しないように言っていますwindow.open編集:画像をimgで表示したい場合があると思いますが、その場合は同じで、src属性にURLを入力するだけで、ajaxはありません。適切な場合に属性を更新するための JavaScript のみ。


あなたのコメントを考えると、私はあなたが望むことを理解しています:

  1. クライアントに画像をキャッシュして、毎回サーバーから画像を取得する必要がないようにします。
  2. ユーザーが自分のエクスペリエンスをカスタマイズして、ローカル ストレージの画像を使用できるようにする。

ここでも、セキュリティ上の理由から、クライアントのファイルへの任意のアクセスは許可されていません。この場合、両方の方法で機能します。1 つ目は、Web ページがユーザーをスパイするのを防ぎ、2 つ目は、ページに悪意のあるコンテンツを挿入するのを防ぎます。

したがって、最初の部分については、私の知る限り、デフォルトは画像をキャッシュすることです [これはブラウザによって処理されます。そうです、サイズが大きくなる傾向があるため、時々クリーニングする必要があります]。それがうまくいかない場合は、cache manifestを使用してみてください。

2番目については、通常の方法はローカルストレージを使用することです[これもブラウザによって処理されますが、クライアントのファイルへの任意のアクセスではありません]画像のURLを保存/取得し、それを使用して画像を表示します。

画像は引き続きサーバーに保存できます。もちろん、キャッシュすることもできます。もちろん、サーバーに取得するには、いつでもアップロードできます。フォームにenctype<input type="file" ... />を設定する必要がある場合があります。――それはもう知ってましたよね?- サーバー上で、画像をデータベース (または専用フォルダー) に保存します。画像を取得できるページは次のようになります。

  • リクエスト方法を確認する
  • ユーザーの権限を確認します(セッション/ Cookieで識別します)
  • リクエストのパラメータを確認します (存在する場合)
  • ヘッダーを設定する
  • データベース(または専用フォルダ)を取得したファイルを出力する

ここで、これを xcopy デプロイ可能なアプリケーション (たまたまブラウザーで実行される) として機能させたいとします。この場合、必要な画像を特定の場所に保存し、相対パスでアクセスするようにユーザーにいつでも指示できます。


または、単にサーバー側のスクリプトの可能性がない場所でホストしているという理由だけで。したがって、javascript が提供するものだけを使用する必要があります。ここでは相対パスを使用できません。これはローカルではないためです...ローカルの絶対パスを使用しようとすると、ブラウザは無視します(つまり、無視します)。

したがって、クライアントのファイルから画像を取得することも、サーバーに保存することもできません...

ご存知のように、そのための作業草案があり、それがあなたが試みていることに気付きました。問題は、それが作業草案であるということです。Jonas Sicking言葉を引用すると、最初の実装はセキュリティの問題によって混乱します。

この機能を Web に公開する際の主な問題はセキュリティです。Web サイトだけで画像を読み取ったり変更したりしたくないでしょう。この API が過去 10 年間のすべての写真を削除できる可能性があることを考えると、GeoLocation API の場合と同じようにプロンプ​​トを出すことができます。おそらくもっと何かが必要です。これは私たちが積極的に取り組んでいるものです。しかし、ここではセキュリティが難しい部分であり、低レベルのファイル操作を実装していないことは間違いありません。

それで、答えは「まだ」だと思いますか?実際、推奨ステータスに達した標準の部分のみを提供する Microsoft のアプローチと、Windows の新しいバージョンごとに新しいバージョンの IE を起動するという Microsoft のアプローチを考慮すると、サポートが提供されるまでしばらく待つ必要があります。すべてのブラウザ。まず、FileAPI が推奨ステータスになるまで待ちます。次に、Microsoft が IE を更新してサポートするまで待ちます。そして、万が一 (それが起こるように) IE10 (または将来の IE11) のみであり、それらの機能が Windows 8 より前の Windows で動作しない場合は、多くの人がアップグレードするのを待つことになります。

これがあなたの状況である場合は、画像ホスティング Web サイトの API を取得し、代わりにそれを使用することをお勧めします [それはおそらく無料ではない (または非公開ではない) ため、既に Web ホスティングを変更することができます]。

于 2012-11-09T09:30:25.993 に答える
0

すべてのブラウザと互換性のあるファイルに応答を格納する一般的な方法はありません。方法があります。JavaScript で FileReader を使用できますが、IE でも動作しません。

私は数週間前に同様の問題を抱えていました。私がしたことは、コンテンツを渡すサーバーに ajax リクエストを行い、サーバーがコンテンツをファイルに保存し、保存されたファイルへの参照を返すことでした。

私は自分のファイルを一時データベーステーブルに保存し、サーバーアクションはファイルのIDを返しました。これにより、いつでもデータベースからファイルにアクセスできます。

ファイルをサーバー上のサムネイルに保存することもできますが、私はデータベースを好みました。

さらに仕様が必要な場合はお知らせください

于 2012-11-09T09:26:09.050 に答える