前言:雖然我做的是上傳到服務器,但是利用代碼操作圖片,大家還是可以借鑑下.反正最後操作完成後的得到的是流對象,然後再將流對象進行'讀'的操作,就可以將處理後的圖片保存到本地
我做的類似於在線上傳頭像的功能,
將圖片進行修改然後得到的路徑上傳到服務器,(得到的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;
}