我试着上传/流的大图像的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做到这一点。 是否有任何人能帮助我吗?
我很感激任何提示在正确的方向。
亲切的问候,克里斯
解决方案
下面我在这里尝试后,从德克和Gigadot输入后为我工作的解决方案。 此刻,我觉得这两种解决方案都值得看。 起初,我尝试后我跟德克有帮助的工作示例,然后我会尝试创建一个与Gigadot帮助。 我将迎来开瑞答案正确的,因为我一直要求明确如何上传过@RequestBody文件。 但我也很好奇,以测试从Gigadot的解决方案,它可能是更容易,更普遍使用。
在下面的例子我存储在MongoDB的GridFS的文件。
溶液1 -德克斯推荐实施例之后
控制器(与在注释测试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 - Gigadots推荐实施例之后
这是在春季手册中描述: http://static.springsource.org/spring/docs/3.2.1.RELEASE/spring-framework-reference/html/mvc.html#mvc-multipart
这是很容易的,也默认包含的所有信息。 我想我会去为这个解决方案至少在二进制上传。
感谢大家张贴和你的答案。 它的大加赞赏。