私はStackoverflowで与えられた様々な方法を試しました。Springブートコントローラでイメージを返す方法とファイルシステムのように役立ちます
私は現在、このような画像になっている(そのコードが、私は変更することはできません)Androidのクライアントがあります。url
画像(CDN上の静的リソース)の場所です
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
を。今では、私のSpring Boot APIエンドポイントは、同じコードがAPIからイメージを取得できるように、ファイルリソースのように動作する必要があります(Springブートバージョン1.3.3)。
は、だから私はこれを持っている:ハンドラ[パブリック org.springframeworkから例外を解決:Androidのコードは
http://someurl/image1.jpg
が、私は私のログにこのエラーを取得する取得しようとする今、。 http://www.ResponseEntity com.myproject.MyController.getImage(java.lang.String)]: org.springframework.web.HttpMediaTypeNotAcceptableException:できませんでした 見つけやすい表現@ResponseBody @RequestMapping(value = "/Image/{id:.+}", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, produces = MediaType.IMAGE_JPEG_VALUE) public ResponseEntity<byte[]> getImage(@PathVariable("id")String id) { byte[] image = imageService.getImage(id); //this just gets the data from a database return ResponseEntity.ok(image); }
http://someurl/image1.jpg
をブラウザに接続すると、同じエラーが発生します。
奇妙なことに私のテストは、[OK]をチェックアウト:
Response response = given()
.pathParam("id", "image1.jpg")
.when()
.get("MyController/Image/{id}");
assertEquals(HttpStatus.OK.value(), response.getStatusCode());
byte[] array = response.asByteArray(); //byte array is identical to test image
がどのように私は、これは通常の方法でアップサービスされている画像のように動作するのですか? (私は、Androidコードが送信されるContent-Typeヘッダを変更することはできません)
EDIT
コードの後にコメント(produces
を取り出し、コンテンツタイプを設定する):
@RequestMapping(value = "/Image/{id:.+}", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE)
public ResponseEntity<byte[]> getImage(@PathVariable("id")String id, HttpServletResponse response) {
byte[] image = imageService.getImage(id); //this just gets the data from a database
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
return ResponseEntity.ok(image);
}
ブラウザでは、これはちょうど文字列化されたジャンク(私は推測する文字にバイト)を与えるようです。 Androidではエラーは発生しませんが、画像は表示されません。私は、これは動作するはずと信じて
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
final List<MediaType> list = new ArrayList<>();
list.add(MediaType.IMAGE_JPEG);
list.add(MediaType.APPLICATION_OCTET_STREAM);
arrayHttpMessageConverter.setSupportedMediaTypes(list);
converters.add(arrayHttpMessageConverter);
super.configureMessageConverters(converters);
}
クライアントはAcceptヘッダーとして何を送信しますか?produce属性を削除してレスポンスにコンテンツタイプを指定するとどうなりますか? –
@JBNizet AcceptヘッダーはHttpURLConnection(Android SDK)のデフォルト値です。間違いなく特に設定されていません。私は 'produce'を省略しようとしましたが、それは(ブラウザで)プレーンテキストを提供するようです。 content-typeの設定は、とにかく 'produce'と同じですか? –
@JBNizetコンテンツタイプを明示的に設定しようとしましたが、ログに同じエラーが表示されます –