[解決済み] REST Web サービスからクライアントにファイルを送信する正しい方法は何ですか?
質問
RESTサービスを開発し始めたところですが、RESTサービスからクライアントにファイルを送信するという難しい状況に出くわしました。これまでのところ、私は単純なデータ型(文字列、整数など)を送信する方法のコツをつかんでいますが、ファイルを送信することは別の問題です。なぜなら、あまりにも多くのファイル形式があり、どこから始めればよいのかさえ分からないからです。私のRESTサービスはJavaで作られており、Jerseyを使用しています。私はすべてのデータをJSONフォーマットで送信しています。
base64エンコーディングについて読みました。ある人はそれが良いテクニックだと言い、他の人はファイルサイズの問題からそうではないと言います。正しい方法は何でしょうか。これは、私のプロジェクトにおける単純なリソース クラスがどのように見えるかです。
import java.sql.SQLException;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import com.mx.ipn.escom.testerRest.dao.TemaDao;
import com.mx.ipn.escom.testerRest.modelo.Tema;
@Path("/temas")
public class TemaResource {
@GET
@Produces({MediaType.APPLICATION_JSON})
public List<Tema> getTemas() throws SQLException{
TemaDao temaDao = new TemaDao();
List<Tema> temas=temaDao.getTemas();
temaDao.terminarSesion();
return temas;
}
}
ファイル送信のコードはこんな感じでしょうか。
import java.sql.SQLException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/resourceFiles")
public class FileResource {
@GET
@Produces({application/x-octet-stream})
public File getFiles() throws SQLException{ //I'm not really sure what kind of data type I should return
// Code for encoding the file or just send it in a data stream, I really don't know what should be done here
return file;
}
}
どのようなアノテーションを使用すればよいのでしょうか?ある人は
@GET
を使って
@Produces({application/x-octet-stream})
というのは正しい方法なのでしょうか?私が送っているファイルは、クライアントがファイルを参照する必要がないように、特定のものです。どなたか、どのようにファイルを送ればいいのか、教えていただけませんか?それとも、JSONオブジェクトとして送信するためにエンコーディングは必要ないのでしょうか?あなたが与えるかもしれない助けのためにありがとうございます。
どのように解決するのですか?
バイナリデータをbase64でエンコードしてJSONでラップするのはお勧めしません。レスポンスのサイズが無駄に大きくなり、速度が低下するだけです。
単に GET を使ってファイルデータを提供し
application/octect-stream
のファクトリーメソッドの一つを使用して
javax.ws.rs.core.Response
(JAX-RSのAPIの一部なので、Jerseyに縛られることはありません)のファクトリーメソッドの一つを使います。
@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile() {
File file = ... // Initialize this to the File path you want to serve.
return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ) //optional
.build();
}
もし、実際の
File
オブジェクトがなく
InputStream
,
Response.ok(entity, mediaType)
も同様に処理できるはずです。
関連
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] RESTful WebServiceにファイルや関連データをJSONで投稿する。
-
[解決済み] PHP の配列を保存するための好ましい方法 (json_encode vs serialize)
-
[解決済み] RESTとRESTfulの違いは何ですか?
-
[解決済み] RESTアプリケーションはステートレスであることが前提である場合、セッションはどのように管理するのですか?
-
[解決済み】データのPOSTに対する400と422のレスポンス
-
[解決済み】RESTウェブサービスを使用して、メタデータを含むファイルをアップロードするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
javaの非静的メソッドを静的に参照することができない
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
強制型変換について
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
API の戻り値を処理するために ResponseEntity を使用する
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。