Java服務器處理圖片上傳的方法
本文實例為大家分享了Java服務器處理圖片上傳的具體代碼,供大家參考,具體內容如下
一、簡述
第一:瀏覽器上傳圖片實現(xiàn);
第二:微信小程序上傳圖片實現(xiàn);
二、圖片上傳功能實現(xiàn)
1.處理H5的單文件上傳實現(xiàn):
package cn.ncist.tms.attachment.controller; ? import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; ? import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ? import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; ? /** ?* 附件上傳類 ?*? ?* @author Fxh ?* ?*/ @RequestMapping(value = "/fileUpload") @Controller public class AttachmentUpload { ?? ? ?? ?/** ?? ? * 上傳文件功能,以Post請求發(fā)送請求, ?? ? *? ?? ? * @param request:請求對象 ?? ? * @param reponse:響應對象 ?? ? * @param file:上傳的文件對象 ?? ? * @return JSON串 : {"code":"S","msg":"服務調用成功"} ?? ? * @throws IOException? ?? ? */ ?? ?@RequestMapping(value = "/doFileUpload",method = RequestMethod.POST) ?? ?@ResponseBody ?? ?public Map<String,Object> doFileUpload(HttpServletRequest request, ?? ??? ??? ?HttpServletResponse reponse, ?? ??? ??? ?@RequestParam("file") MultipartFile srcFile) throws IOException{ ?? ??? ? ?? ??? ?/* ?? ??? ? * 注意:傳入參數(shù)時,文件的注解@ReuqestParam("variable") -->variable指:前端的h5的控件的name值. ?? ??? ? *? ?? ??? ? * 文件處理功能: 1.將獲取的字節(jié)數(shù)組轉化為文件對象,并保存在本地目錄中; ?? ??? ? *? ?? ??? ? * 文件處理思路: 1.將獲取的(source)file對象,通過函數(shù)獲取字節(jié)數(shù)組; ?? ??? ? * ?? ??? ??? ??? ?2.實例化文件對象和文件輸出流; ?? ??? ? * ?? ??? ??? ??? ?3.將字節(jié)數(shù)組寫入文件即可. ?? ??? ? *? ?? ??? ? * 功能難度: 簡單. ?? ??? ? */ ?? ??? ? ?? ??? ?//1.變量聲明 ?? ??? ?Map<String,Object> result = null;// 返回結果變量 ?? ??? ?FileOutputStream fos = null; ?? ?//寫入文件的變量 ?? ??? ?File destFile = null;?? ?//寫入的目的地文件(distination) ?? ??? ? ?? ??? ?try { ?? ??? ??? ?result = new HashMap<String,Object>(); ?? ??? ??? ? ?? ??? ??? ?//2.參數(shù)驗證 ?? ??? ??? ?if(srcFile == null){ ?? ??? ??? ??? ?throw new RuntimeException("上傳文件不存在"); ?? ??? ??? ?} ?? ??? ??? ?if(srcFile.getBytes().length == 0){ ?? ??? ??? ??? ?throw new RuntimeException("上傳文件內容為空"); ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ??? ?//3.操作文件對象,寫入本地目錄的文件中 ?? ??? ??? ? ?? ??? ??? ?//3.1 截取文件后綴 ?? ??? ??? ?String ext = srcFile.getOriginalFilename().substring(srcFile.getContentType().lastIndexOf( ".")+1); ?? ??? ??? ?//3.2 實例化目標文件,根據當前的操作系統(tǒng),指定目錄文件, ?? ??? ??? ?destFile = new File("D:"+File.separator+"descFolder"+File.separator+"descFile."+ext); ?? ??? ??? ?//3.3 實例化流 ?? ??? ??? ?fos = new FileOutputStream(destFile); ?? ??? ??? ?//3.4 獲取寫入的字節(jié)數(shù)組,并寫入文件?? ? ?? ??? ??? ?byte[] srcBytes = srcFile.getBytes(); ?? ??? ??? ?fos.write(srcBytes); ?? ??? ??? ?fos.flush(); ?? ??? ??? ?//4.對輸入、輸出流進行統(tǒng)一管理 ?? ??? ??? ?//已在文件finally代碼塊處理 ?? ??? ??? ? ?? ??? ??? ?result.put( "code", "S"); ?? ??? ??? ?result.put( "msg", "服務調用成功"); ?? ??? ??? ?result.put( "path", destFile.getAbsolutePath()); ?? ??? ??? ?return result; ?? ??? ?} catch (Exception e) { ?? ??? ??? ?// TODO: handle exception ?? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?result = new HashMap<String,Object>(); ?? ??? ??? ?result.put( "code", "F"); ?? ??? ??? ?result.put( "msg", "服務調用失敗"); ?? ??? ??? ?result.put( "path", null); ?? ??? ??? ?return result; ?? ??? ?} finally{ ?? ??? ??? ?//關閉系統(tǒng)資源,避免占用資源. ?? ??? ??? ?if(fos != null){ ?? ??? ??? ??? ?fos.close(); ?? ??? ??? ?} ?? ??? ?} ?? ?} }
2.微信或手機APP上傳圖片文件的代碼實現(xiàn):
import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; ? import javax.annotation.Resource; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ? import org.jboss.netty.handler.codec.http.HttpRequest; import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; ? import com.hlinkcloud.ubp.core.constant.RedisKeyConstant; import com.hlinkcloud.ubp.core.service.RedisService; import com.hlinkcloud.ubp.core.util.BaseStringUtil; import com.hlinkcloud.ubp.facade.bean.common.FastDFSFile; import com.hlinkcloud.ubp.facade.bean.common.FileManagerConfig; import com.hlinkcloud.ubp.facade.service.common.FileInfoService; import com.hlinkcloud.ubp.facade.service.permission.UserService; import com.hlinkcloud.ubp.facade.util.DictionaryCommUtil; ? import fr.opensagres.xdocreport.core.io.internal.ByteArrayOutputStream; ? /** ?* 微信上傳圖片業(yè)務 ?*? ?* @author FengQi ?* ?*/ @Controller @RequestMapping("/wx_upload") public class WxUploadImgBusiness { ? ?? ?@Resource ?? ?private UserService userService; ? ?? ?@Resource ?? ?private RedisService redisService; ? ?? ?@Resource(name = "commonUtil") ?? ?private DictionaryCommUtil commUtil; ? ?? ?@Resource ?? ?private FileInfoService fileService; /* 文件服務 */ ?? ? ?? ?@RequestMapping("/getUploadFilePath") ?? ?@ResponseBody ?? ?public Map<String, Object> doWxUploadFile(HttpServletRequest request, HttpServletResponse response) { ? ?? ??? ?HashMap<String, Object> map = new HashMap<String, Object>(); ?? ??? ? ?? ??? ?try { ?? ??? ??? ? ?? ??? ??? ?/* ?? ??? ??? ? * // 注釋:該部分是使用在沒有使用sprinvMVC的架構下的圖片上傳. // 1.磁盤文件條目工廠 ?? ??? ??? ? * DiskFileItemFactory factory = new DiskFileItemFactory(); ?? ??? ??? ? *? ?? ??? ??? ? * //2.1 高速的文件上傳處理類 ServletFileUpload sfu = new ?? ??? ??? ? * ServletFileUpload(factory); ?? ??? ??? ? *? ?? ??? ??? ? * List<FileItem> list = sfu.parseRequest(request); FileItem picture ?? ??? ??? ? * = null; if(list != null && list.size() > 0){ for(FileItem item : ?? ??? ??? ? * list){ if(!item.isFormField()){ picture = item; } } } ?? ??? ??? ? */ ? ?? ??? ??? ?// 1.將請求轉化為操作流的請求對象. ?? ??? ??? ?MultipartHttpServletRequest req = (MultipartHttpServletRequest) request; ?? ??? ??? ?MultipartFile picture = req.getFile("file"); ?? ??? ??? ? ?? ??? ??? ?if(picture != null && picture.getBytes().length != 0){ ?? ??? ??? ??? ?// 2.將圖片上傳到服務器 ?? ??? ??? ??? ?byte[] bytes = picture.getBytes(); ?? ??? ??? ??? ?String ext = picture.getOriginalFilename().substring( ?? ??? ??? ??? ??? ??? ?picture.getOriginalFilename().lastIndexOf(".") + 1 ?? ??? ??? ??? ??? ??? ?); ?? ??? ??? ??? ?// (備注:下列代碼為內部業(yè)務代碼,可根據公司自身的需求,進行更改) ?? ??? ??? ??? ? ?? ??? ??? ??? ? ?? ??? ??? ??? ?map.put("code", "S"); ?? ??? ??? ??? ?map.put( "msg", "服務調用成功"); ?? ??? ??? ??? ?map.put("statusCode", 200); ?? ??? ??? ??? ?map.put("data", filePath); ?? ??? ??? ?}else{ ?? ??? ??? ??? ?throw new RuntimeException("上傳圖片異?;蚩請D片!"); ?? ??? ??? ?} ?? ??? ?} catch (IOException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?map.put("code", "F"); ?? ??? ??? ?map.put("msg", "服務調用失敗"); ?? ??? ??? ?map.put("statusCode", 500); ?? ??? ??? ?map.put("data", null); ?? ??? ?} ?? ??? ?return map; ?? ?} ?? ? ?? ?/** ?? ? * 當不知道手機、微信傳入前端的參數(shù)是什么時, ?? ? *? ?? ? * 可調用該接口進行判斷. ?? ? *? ?? ? * @param request ?? ? * @param response ?? ? * @return ?? ? * @throws IOException ?? ? */ ?? ?@RequestMapping(value = "/doUploadFileOfCI" , method = RequestMethod.POST ) ?? ?public @ResponseBody Map<String,Object> doUploadFile( ?? ??? ??? ?HttpServletRequest request,//請求對象 ?? ??? ??? ?HttpServletResponse response) throws IOException{//響應對象 ?? ??? ? ?? ??? ?System.out.println("doTestMultipartFile:"); ?? ??? ? ?? ??? ?MultipartHttpServletRequest req = (MultipartHttpServletRequest) request; ?? ??? ?//此時說明請求對象是MultipartHttpServletRequest對象 ?? ??? ?MultipartFile picture = req.getFile("UploadedImage"); ?? ??? ? ?? ??? ?//遍歷請求得到所有的數(shù)據. ?? ??? ?if(req != null){ ?? ??? ??? ? ?? ??? ??? ?//獲取所有屬性名 ?? ??? ??? ?Enumeration enume= req.getAttributeNames(); ?? ??? ??? ?while(enume.hasMoreElements()){ ?? ??? ??? ??? ?System.out.println("enume:"+enume.nextElement()); ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ??? ?//獲取所有文件名 ?? ??? ??? ?Iterator<String> fileNames = req.getFileNames(); ?? ??? ??? ?while(fileNames.hasNext()){ ?? ??? ??? ??? ?System.out.println("fileNames:"+fileNames.next()); ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ??? ?//獲取操作文件的map ?? ??? ??? ?Map<String,MultipartFile> fileMap = ?req.getFileMap(); ?? ??? ??? ?if(fileMap != null && fileMap.size() > 0){ ?? ??? ??? ??? ?Set<String> set = fileMap.keySet(); ?? ??? ??? ??? ?for(String key:set){ ?? ??? ??? ??? ??? ?System.out.println("String:"+key); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ??? ?//獲取請求流 ?? ??? ??? ?InputStream is = req.getInputStream(); ?? ??? ??? ?System.out.println("InputStream:"+is); ?? ??? ??? ?int length = -1; ?? ??? ??? ?while( (length = is.read()) != -1 ){ ?? ??? ??? ??? ?System.err.println("data:"+length); ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ??? ?//獲取所有請求參數(shù) ?? ??? ??? ?Enumeration enumee = req.getParameterNames(); ?? ??? ??? ?while(enumee.hasMoreElements()){ ?? ??? ??? ??? ?System.out.println("enumee:"+enumee.nextElement()); ?? ??? ??? ?} ?? ??? ?} ?? ??? ? ?? ??? ?System.out.println(picture); ?? ??? ? ?? ??? ? ?? ??? ?return null; ?? ?} ? }
總結:圖片上傳均是將圖片的字節(jié)數(shù)據,以HTTP協(xié)議(其他編程語言自行定義傳輸協(xié)議) 進行數(shù)據的傳輸,當服務器接收到后,解析HTTP協(xié)議的圖片數(shù)據并封裝成Request請求對象,最后通過請求對象便可獲取封裝好的文件對象。(注:當項目配置SpringMVC的文件上傳解析器后,可以在請求方法的參數(shù)中傳入Multipart類型變量或解析Request對象。)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java中byte[]、String、Hex字符串等轉換的方法
這篇文章主要介紹了Java中byte[]、String、Hex字符串等轉換的方法,代碼很簡單,需要的朋友可以參考下2018-05-05Java?報錯?java.util.ConcurrentModificationException:?null?
這篇文章主要介紹了Java?報錯?java.util.ConcurrentModificationException:?null?的原因和解決方案,這個異常通常在多線程環(huán)境下出現(xiàn),意味著在迭代過程中,集合或者映射的結構發(fā)生了變化,本文分享完美解決方案,需要的朋友可以參考下2023-07-07