3

私は、ユーザーがパラメーターを入力し、データをさまざまなファイル形式 (xml、html (画面上)、csv など) で返すオプションがある Web サービスに取り組んでいます。

サーバーがファイルの内容を生成する (そのため、実際のファイルがない) 場合、ファイルへの URL を返すことはできません。では、これを行うにはどうすればよいでしょうか。要素内のデータがバイナリであることを示す xml 属性があることは知っていますが、ブラウザがデータをファイルとしてダウンロードすることはありません。

Content DispositionXML/Web サービスに相当するものはありますか?

非常に関連するメモについて:

javascript/AJAX はブラウザをトリガーしてファイルをダウンロードできますか? jsだけではファイルを「生成」する機能がないことを知っています(ブラウザが特定のファイル名のファイルとして文字列をダウンロードするという意味で)が、ajax関数がスクリプトを呼び出し、スクリプトの応答がヘッダーはダウンロードするように設定されていますか?

私はその最後の部分で実験しますが、確かな情報がすでにそこにあるかどうか知りたい.


詳細:

まず、回答してくれたすべての人に感謝します。すべての回答は本当に役に立ち、教育的でした。

回答にまたがるすべてのコメント/懸念/提案を結び付けるために、状況についてもう少し説明しようとするかもしれないと思いました.

社内スタッフの Web サイトのプロジェクトを管理しています。このプロジェクトは、主にスケジュールの表示と変更を扱います。基本的に同じデータを MySQL DB に照会する、少なくとも 4 つの異なる PHP スクリプトがあります。クエリは、コンテキストによって若干異なります。あるケースでは、割り当てごとにグループ化された毎日のスケジュールを取得し、別のケースでは、1 週間のスケジュールを照会して人ごとにグループ化します。さらに別の例では、たった 1 人の人の週間スケジュールを照会します。1 人、1 日、またはポジションごとの時間ごとの合計などのデータを出力するものもあれば、DB に格納されているものだけを出力するものもあります。

私はプロジェクトの特定の側面について罪悪感を感じ始めました. 明らかに、多くのデータ フェッチを 1 つの組み込みスクリプトに組み合わせることができます。結果を処理するには、おそらくオブジェクト指向の PHP を使用する必要があります。そして、私は、データが安全でセキュアであること、および DB へのストレスが最小限に抑えられ、最適化されていることを確認するよりも、この混乱を機能させることに重点を置いてきました。クエリが最適化されているかどうかを本当に知る方法さえわかりません。

そして、上記の罪悪感に加えて、私は本当に混乱し始めました. 物事を整理しようとして、うまく機能していたものを1つの修正で台無しにする結び目に巻き込まれていることに気づきました。

そのため、プロセス全体を簡素化し、データのフェッチ方法に関するロジック (API でさえも) を強制する Web サービスを作成することが良い解決策であると考えました。最終的に私が主任開発者ではなくなったときに引き継ぎます。さらに、サイトのバックエンドのアップグレードとシフトの両方 (Cold Fusion を使用する Windows サーバー上にある日もあるかもしれませんが、私はその考えに身震いします) と、接続したい他のソフトウェアのために、全体の移植性を高めます。データベースと。

しかし、ここにこすりがあります:

このプロジェクトの全体的な起源は、以前のスケジューリング ソリューションが、私たちが使用する非常に高価なエンタープライズ レベルのスケジューリング ソフトウェアによって生成された、非常に醜く非意味的な HTML レポートをアップロードすることであったという事実に基づいていました。この忌まわしい HTML レポートとそれを生成したソフトウェアで私たちが抱えていた最大の.ics問題は、Outlook や Google カレンダーにインポートできる「icalendar」ファイルのオプションがないことでした。私は、これらのひどいレポートを ics ファイルに変換する方法を見つけることを個人的な使命としており、PHP、正規表現、および MySQL を学び始めた理由についての話を始めました。

したがって、まだ退屈して眠っていない場合は、Web サービスがスケジュール プロセスを簡素化および合理化するための最良のオプションだと思いますが、データの最も価値のある部分を取得するために単純な PHP/MySQL を使用する必要がある場合(カレンダーファイル)それから私はすべてを捨てて、結び目を解き続けたいと思っています.

ところで、Web サービスを使用するスクリプトで ics ファイルを作成できることと、ユーザーが AJAX を要求している場合は AJAX を簡単に回避できることは理解しています。繰り返しますが、これをより明確にしてくれたすべての人に感謝します。HTML/JS/PHP とデータベースの間の明確なパーティションの感覚を持たせるために、Web サービスが DB によって返されたすべてを可能な限り処理することを望んでいます。

再度、感謝します!

4

6 に答える 6

3

ブラウザにファイルをダウンロードさせるには、次のようにします。

window.location = "http://example.com/webservice-file-url";

そしてヘッダーを使用します:

Content-Disposition: attachment; filename="filename.ext"

ユーザーに画面上での表示とダウンロードのどちらかを選択させたい場合は、条件を使用してください。

if (requested_format == 'html') {
    //get an html version and show it on screen
    ajaxRequestForHTML();
} else {
    //download the file
    window.location = "http://example.com/webservice-file-url";
}
于 2009-08-16T17:36:11.513 に答える
0

うまくいかないのではないかと心配しています。AJAX 呼び出しは、応答ヘッダーをブラウザーに渡しません。ヘッダーを変更した場合にできる唯一のことは、ヘッダーが認識されないために AJAX 呼び出しが失敗する可能性があることです。

私が見る唯一の解決策は、ファイルへの URL を返し、そのダウンロードをトリガーする新しい JS ウィンドウを開くことです。

于 2009-08-16T13:18:55.130 に答える
0

Web サービスからバイト配列を返します。ファイルサービスに送信する場合も同様です。

于 2009-08-16T13:25:48.683 に答える
0

一般的なブラウザ環境では、JavaScript は (セキュリティ上の理由から) クリップボードやファイルシステムにアクセスできません。いくつかの議論については、clipboard-image-directly-save-in-to-client-side-using-javascript、または同様の質問 を参照してください。

can-javascript-access-a-filesystemなどの例外があります。

于 2009-08-16T13:26:36.747 に答える
0

Web サービスの要点は、ブラウザーから直接アクセスするためのものではなく、他の Web アプリケーションが使用するための API であるということです。したがって、おそらく、Web サービスを呼び出してデータを HTTP 応答内のファイルとして提供する、使いやすいフロントエンドを作成する必要があります。これにより、ブラウザがファイルとしてダウンロードします。

于 2009-08-16T13:38:52.337 に答える
0

これを Web サービスにしますか? 適切な content-disposition を使用して、データをファイルとして返すだけの、パラメーター用のフォーム フィールドを備えた通常の Web ページはどうでしょうか。


あなたの更新に基づいて、Web サービスが .ics ファイルを返すことを望んでいないことは確かです。必要なのは、クエリ文字列を使用していくつかのパラメーターを受け入れ、「添付ファイル」のコンテンツ処理を使用してファイルを返すスクリプトです。これにより、ユーザーは .ics ファイルを開くように求められます。

ここで、いくつかの同様のスクリプトをリファクタリングして、冗長性とメンテナンスを削減することもお勧めします。ただし、すべての変更が何かを壊すことについてあなたが言ったことについて心配しています。リファクタリングを開始する前に、できれば自動化された、少なくとも小さなテスト スイートを自分で構築する必要があります。そうすれば、小さな変更を加えるたびにテストを実行して、まだ何か壊れていないかどうかを確認できます。このように、何かを壊すときは、1 時間分の価値しか壊すことができません。

含まれているスクリプトを使用するか、PHP が再利用のために持っているメカニズムを使用して、PHP スクリプトをリファクタリングすることをお勧めします (私は PHP を知りません)。すると、共通コードの一部が Web サービスとして適切に実装されることがわかる場合があります。

于 2009-08-16T16:56:58.207 に答える