package com.mossle.user.web; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import javax.annotation.Resource; import javax.imageio.ImageIO; import com.mossle.api.store.StoreConnector; import com.mossle.api.store.StoreDTO; import com.mossle.api.tenant.TenantHolder; import com.mossle.core.export.Exportor; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.spring.MessageHelper; import com.mossle.core.store.InputStreamDataSource; import com.mossle.core.store.MultipartFileDataSource; import com.mossle.core.util.IoUtils; import com.mossle.user.ImageUtils; import com.mossle.user.persistence.domain.AccountAvatar; import com.mossle.user.persistence.domain.AccountInfo; import com.mossle.user.persistence.manager.AccountAvatarManager; import com.mossle.user.persistence.manager.AccountInfoManager; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping("user") public class AccountAvatarController { private AccountInfoManager accountInfoManager; private AccountAvatarManager accountAvatarManager; private MessageHelper messageHelper; private Exportor exportor; private BeanMapper beanMapper = new BeanMapper(); private StoreConnector storeConnector; private TenantHolder tenantHolder; @RequestMapping("account-avatar-input") public String input(@RequestParam("id") Long id, Model model) { AccountInfo accountInfo = accountInfoManager.get(id); String hql = "from AccountAvatar where accountInfo=? and type='default'"; AccountAvatar accountAvatar = accountAvatarManager.findUnique(hql, accountInfo); model.addAttribute("accountInfo", accountInfo); model.addAttribute("accountAvatar", accountAvatar); return "user/account-avatar-input"; } /** * 上传. */ @RequestMapping("account-avatar-upload") @ResponseBody public String upload(@RequestParam("id") Long id, @RequestParam("avatar") MultipartFile avatar) throws Exception { String tenantId = tenantHolder.getTenantId(); StoreDTO storeDto = storeConnector.saveStore("avatar", new MultipartFileDataSource(avatar), tenantId); AccountInfo accountInfo = accountInfoManager.get(id); String hql = "from AccountAvatar where accountInfo=? and type='default'"; AccountAvatar accountAvatar = accountAvatarManager.findUnique(hql, accountInfo); if (accountAvatar == null) { accountAvatar = new AccountAvatar(); accountAvatar.setAccountInfo(accountInfo); accountAvatar.setType("default"); } accountAvatar.setCode(storeDto.getKey()); accountAvatarManager.save(accountAvatar); return "{\"success\":true,\"id\":\"" + id + "\"}"; } /** * 显示. */ @RequestMapping("account-avatar-view") @ResponseBody public void avatar(@RequestParam("id") Long id, OutputStream os) throws Exception { String tenantId = tenantHolder.getTenantId(); AccountInfo accountInfo = accountInfoManager.get(id); String hql = "from AccountAvatar where accountInfo=? and type='default'"; AccountAvatar accountAvatar = accountAvatarManager.findUnique(hql, accountInfo); if (accountAvatar == null) { return; } StoreDTO storeDto = storeConnector.getStore("avatar", accountAvatar.getCode(), tenantId); IoUtils.copyStream(storeDto.getDataSource().getInputStream(), os); } @RequestMapping("account-avatar-crop") public String crop(@RequestParam("id") Long id, Model model) throws Exception { String tenantId = tenantHolder.getTenantId(); AccountInfo accountInfo = accountInfoManager.get(id); String hql = "from AccountAvatar where accountInfo=? and type='default'"; AccountAvatar accountAvatar = accountAvatarManager.findUnique(hql, accountInfo); model.addAttribute("accountInfo", accountInfo); model.addAttribute("accountAvatar", accountAvatar); if (accountAvatar == null) { return "user/account-avatar-crop"; } StoreDTO storeDto = storeConnector.getStore("avatar", accountAvatar.getCode(), tenantId); BufferedImage bufferedImage = ImageIO.read(storeDto.getDataSource() .getInputStream()); int height = bufferedImage.getHeight(); int width = bufferedImage.getWidth(); if (height > width) { int h = 512; int w = (512 * width) / height; int min = w; model.addAttribute("h", h); model.addAttribute("w", w); model.addAttribute("min", min); } else { int w = 512; int h = (512 * height) / width; int min = h; model.addAttribute("h", h); model.addAttribute("w", w); model.addAttribute("min", min); } return "user/account-avatar-crop"; } @RequestMapping("account-avatar-save") public String save(@RequestParam("id") Long id, @RequestParam("x1") int x1, @RequestParam("x2") int x2, @RequestParam("y1") int y1, @RequestParam("y2") int y2, @RequestParam("w") int w, Model model) throws Exception { String tenantId = tenantHolder.getTenantId(); AccountInfo accountInfo = accountInfoManager.get(id); String hql = "from AccountAvatar where accountInfo=? and type='default'"; AccountAvatar accountAvatar = accountAvatarManager.findUnique(hql, accountInfo); model.addAttribute("accountInfo", accountInfo); model.addAttribute("accountAvatar", accountAvatar); if (accountAvatar != null) { StoreDTO storeDto = storeConnector.getStore("avatar", accountAvatar.getCode(), tenantId); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageUtils.zoomImage(storeDto.getDataSource().getInputStream(), baos, x1, y1, x2, y2); storeDto = storeConnector.saveStore("avatar", new InputStreamDataSource(w + ".png", new ByteArrayInputStream(baos.toByteArray())), tenantId); accountAvatar.setCode(storeDto.getKey()); accountAvatarManager.save(accountAvatar); } return "user/account-avatar-save"; } // ~ ====================================================================== @Resource public void setAccountInfoManager(AccountInfoManager accountInfoManager) { this.accountInfoManager = accountInfoManager; } @Resource public void setAccountAvatarManager( AccountAvatarManager accountAvatarManager) { this.accountAvatarManager = accountAvatarManager; } @Resource public void setMessageHelper(MessageHelper messageHelper) { this.messageHelper = messageHelper; } @Resource public void setExportor(Exportor exportor) { this.exportor = exportor; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } }