前言:虽然我做的是上传到服务器,但是利用代码操作图片,大家还是可以借鉴下.反正最后操作完成后的得到的是流对象,然后再将流对象进行'读'的操作,就可以将处理后的图片保存到本地
我做的类似于在线上传头像的功能,
将图片进行修改然后得到的路径上传到服务器,(得到的url是直接可以在浏览器上访问并显示的)
再将得服务器返回的url添加到数据库
一共上传了2张图片到服务器
一张是未进行处理
还一张是处理过的
用到的工具类的命名空间(基本都是常用的类):
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.UUID;
import javax.imageio.ImageIO;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
controller内操作:
/**
* 图片操作
*
* @param sessionId
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/image", method = RequestMethod.POST)
@ResponseBody
public ResultData<Integer> addImage(@CookieValue(value = "sid", defaultValue = "") String sessionId, HttpServletRequest request, HttpServletResponse response) {
ResultData<Integer> resultData = new ResultData<Integer>();
try {
//根据sessionId获取当前的user对象(这一步无需关心)
String username = SystemManager.getInstance().getUserCookieMap().get(sessionId);
UserDomain user = membersService.selectUserByUsername(username);
int uid = user.getUid();
//获取request对象
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获得第1张图片(根据前台的name名称得到上传的文件)
MultipartFile imageFile = multipartRequest.getFile("file");
//先保存小图(这里必须先获取流对象,否者会抛异常)
InputStream iss = imageFile.getInputStream();
-------- BufferedImage _buff_image=ImageIO.read(iss);//这里是要操作的对象,注意看命名,别和下面的实体类image搞混了
|
|
| //非空验证
|
| if (null == imageFile) {
| resultData.setStatus(1);
| resultData.setData(null);
| resultData.setMsg("图片未选中");
| return resultData;
| } else {
|
|
| //不了解uuid的同学可以先看看我的博客,有介绍uuid
|
| String fileName = UUID.randomUUID().toString();
|
|
|
| //这里是设置的服务器上的路径,会在服务器上创建这些路径
|
| String path = "/image/tweet/";// 设置相对服务器路径
| String savePath = path + fileName; //设置保存服务器路径
|
| //上传到服务器,这时服务器会返回一条url
| String imageUrl = uploadFileService.uploadypyun(multipartRequest, savePath);
|
| //实例化图片类
| TopicImage image = new TopicImage();
| //设置属性
| image.setDateline(StringFormat.getSystemTime());//时间
| image.setPhoto(imageUrl);//原图路径
| image.setName(fileName);//文件名
| image.setDescription(imageFile.getOriginalFilename());
| int size = new Long(imageFile.getSize()).intValue();//文件大小
| image.setFilesize(size);
|
| //缩略图操作
|--------> short ow=(short)_buff_image.getWidth();
short oh=(short)_buff_image.getHeight();
//缩略图操作
//高度
int height = 300;
int _ow=_buff_image.getWidth();
int _oh=_buff_image.getHeight();
float _hb=(float)_oh/(float)height;
int width=(int) ((float)_ow/(float)_hb);
Image _image=_buff_image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
_buff_image=null;
_buff_image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics _gs=_buff_image.getGraphics();_gs.drawImage(_image, 0, 0, null);
_gs.dispose();
//字节数组流
ByteArrayOutputStream _bbos=new ByteArrayOutputStream();
ImageIO.write(_buff_image, "JPG", _bbos);
_bbos.flush();
//关流
_bbos.close();
//新建流对象>>>>>>这个名为is流对象里面就有处理后的图片
InputStream is = new ByteArrayInputStream(_bbos.toByteArray());
//缩略图上传>>>>这里就和上面那一步一样,上传到服务器
String thumb_path = "/image/tweet/thumb/";// 设置相对路径
String savePath2 = thumb_path + fileName;
image.setImageUrl(uploadFileService.uploadThumbYpyun(is, savePath2));
//设置属性
image.setWidth(ow);
image.setHeight(oh);
image.setUid(uid);
image.setUsername("");
//上传tupian
image = tweetService.insertImage(image);
resultData.setStatus(0);
resultData.setData(image.getId());
resultData.setMsg("上传成功");
}
} catch (Exception e) {
// TODO: handle exception
//logger.error(e.toString());
resultData.setStatus(1);
resultData.setData(null);
resultData.setMsg(Constant.tweetMessage);
}
// request 获取用户uid
return resultData;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
service中操作:
>>这里是上传到服务器,然后添加到数据 库用的,如果只关心图片处理可以不用看哦
这里是以HttpServletRequest获取当前页面传过来的request直接作为参数获取图片对象,保存后上传
/**
* 保存上传图片(正常大小)
*
* @param request
* @param savePath:/目录名/文件名
* @return 返回图片url
* @throws IOException
*/
@Override
public String uploadypyun(HttpServletRequest request, String savePath) {
final MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
final Map<String, MultipartFile> files = multiRequest.getFileMap();
for (Object item : files.values()) {
MultipartFile file = (MultipartFile) item;
String path = "./" + HelperUtil.getUUID();
try {
file.transferTo(new File(path));
String r = ImageUtil.uploadImage(path, savePath);
return r;
} catch (IOException e) {
throw new ServiceException();
} finally {
try {
new File(path).delete();
} catch (Exception e) {
}
}
}
return null;
}
这里直接以流的方式保存对象,然后上传
/**
* 上传略缩图图片
*
* @param request
* @param savePath:/目录名/文件名
* @return 返回图片url
* @throws IOException
*/
@Override
public String uploadThumbYpyun(InputStream is, String savePath) {
String r ="";
String path = "./" + HelperUtil.getUUID();
try {
FileUtils.copyInputStreamToFile(is, new File(path));
r = ImageUtil.uploadImage(path, savePath);
} catch (IOException e) {
throw new ServiceException();
} finally {
try {
new File(path).delete();
} catch (Exception e) {
}
}
return r;
}