Я пытаюсь загрузить/передать большое изображение контроллеру 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. Я буду отмечать ответ Dirks как правильный, поскольку я просил явным образом загрузить файл через @RequestBody. Но мне также интересно проверить решение от Gigadot, поскольку это, возможно, проще и более распространено в использовании.
В приведенных ниже примерах я храню файлы в MongoDB GridFS.
Решение 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
Это довольно просто и также содержит всю информацию по умолчанию. Я думаю, что поеду за этим решением, по крайней мере, для двоичных загрузок.
Спасибо всем за сообщение и за ваши ответы. Это очень ценится.