大きな画像をRESTコントローラーにアップロード/ストリーミングしようとしています。RESTコントローラーはファイルを取得してデータベースに保存します。
@Controller
@RequestMapping("/api/member/picture")
public class MemberPictureResourceController {
@RequestMapping(value = "", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void addMemberPictureResource(@RequestBody InputStream image) {
// Process and Store image in database
}
}
これは、私が達成しようとしていることの機能しない例です(もちろん、または、InputStreamが機能していないと思います)。@RequestBodyを介して画像をストリーミング/読み取りたい。
私はどこでも検索しましたが、これを達成するための良い例を見つけることができません。ほとんどの人は、フォームを介して画像をアップロードする方法だけを尋ねているようですが、REST/RestTemplateを使用してアップロードすることはありません。これを手伝ってくれる人はいますか?
正しい方向へのヒントに感謝します。
よろしく、クリス
ソリューション
ここの下に、DirkとGigadotからの入力の後に私のために働いた解決策を投稿しようとしています。現時点では、両方のソリューションを検討する価値があると思います。最初はDirkの助けを借りて実用的な例を投稿し、次にGigadotの助けを借りて実例を作成しようとします。@RequestBodyを介してファイルをアップロードする方法を明示的に尋ねてきたので、Dirksの回答を正しいものとしてマークします。しかし、Gigadotのソリューションをテストすることにも興味があります。おそらく、より簡単で一般的に使用できるからです。
以下の例では、ファイルをMongoDBGridFSに保存します。
解決策1-Dirks推奨後の例
コントローラー(コメントでテストするためのcurlコマンドを使用):
/**
*
* @author charms
* curl -v -H "Content-Type:image/jpeg" -X PUT --data-binary @star.jpg http://localhost:8080/api/cardprovider/logo/12345
*/
@Controller
@RequestMapping("/api/cardprovider/logo/{cardprovider_id}")
public class CardproviderLogoResourceController {
@Resource(name = "cardproviderLogoService")
private CardproviderLogoService cardproviderLogoService;
@RequestMapping(value = "", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void addCardproviderLogo(@PathVariable("cardprovider_id") String cardprovider_id,
HttpEntity<byte[]> requestEntity) {
byte[] payload = requestEntity.getBody();
InputStream logo = new ByteArrayInputStream(payload);
HttpHeaders headers = requestEntity.getHeaders();
BasicDBObject metadata = new BasicDBObject();
metadata.put("cardproviderId", cardprovider_id);
metadata.put("contentType", headers.getContentType().toString());
metadata.put("dirShortcut", "cardproviderLogo");
metadata.put("filePath", "/resources/images/cardproviders/logos/");
cardproviderLogoService.create1(logo, metadata);
}
}
サービス(未完成ですがテストとして機能しています):
@Service
public class CardproviderLogoService {
@Autowired
GridFsOperations gridOperation;
public Boolean create1(InputStream content, BasicDBObject metadata) {
Boolean save_state = false;
try {
gridOperation.store(content, "demo.jpg", metadata);
save_state = true;
} catch (Exception ex) {
Logger.getLogger(CardproviderLogoService.class.getName())
.log(Level.SEVERE, "Storage of Logo failed!", ex);
}
return save_state;
}
}
解決策2-ギガドット推奨後の例
これについては、Springのマニュアルで説明されています: http ://static.springsource.org/spring/docs/3.2.1.RELEASE/spring-framework-reference/html/mvc.html#mvc-multipart
これは非常に簡単で、デフォルトですべての情報が含まれています。少なくともバイナリアップロードについては、このソリューションを採用すると思います。
投稿してくれてありがとう。大変感謝しております。