Java服務器處理圖片上傳的方法
一、簡述
第一:瀏覽器上傳圖片實現;
第二:微信小程序上傳圖片實現;
二、圖片上傳功能實現
1.處理H5的單文件上傳實現:
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請求發送請求,
*
* @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{
/*
* 註意:傳入參數時,文件的註解@ReuqestParam("variable") –>variable指:前端的h5的控件的name值.
*
* 文件處理功能: 1.將獲取的字節數組轉化為文件對象,並保存在本地目錄中;
*
* 文件處理思路: 1.將獲取的(source)file對象,通過函數獲取字節數組;
* 2.實例化文件對象和文件輸出流;
* 3.將字節數組寫入文件即可.
*
* 功能難度: 簡單.
*/
//1.變量聲明
Map<String,Object> result = null;// 返回結果變量
FileOutputStream fos = null; //寫入文件的變量
File destFile = null; //寫入的目的地文件(distination)
try {
result = new HashMap<String,Object>();
//2.參數驗證
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 實例化目標文件,根據當前的操作系統,指定目錄文件,
destFile = new File("D:"+File.separator+"descFolder"+File.separator+"descFile."+ext);
//3.3 實例化流
fos = new FileOutputStream(destFile);
//3.4 獲取寫入的字節數組,並寫入文件
byte[] srcBytes = srcFile.getBytes();
fos.write(srcBytes);
fos.flush();
//4.對輸入、輸出流進行統一管理
//已在文件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{
//關閉系統資源,避免占用資源.
if(fos != null){
fos.close();
}
}
}
}
2.微信或手機APP上傳圖片文件的代碼實現:
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;
/**
* 微信上傳圖片業務
*
* @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
);
// (備註:下列代碼為內部業務代碼,可根據公司自身的需求,進行更改)
map.put("code", "S");
map.put( "msg", "服務調用成功");
map.put("statusCode", 200);
map.put("data", filePath);
}else{
throw new RuntimeException("上傳圖片異常或空圖片!");
}
} catch (IOException e) {
e.printStackTrace();
map.put("code", "F");
map.put("msg", "服務調用失敗");
map.put("statusCode", 500);
map.put("data", null);
}
return map;
}
/**
* 當不知道手機、微信傳入前端的參數是什麼時,
*
* 可調用該接口進行判斷.
*
* @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");
//遍歷請求得到所有的數據.
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);
}
//獲取所有請求參數
Enumeration enumee = req.getParameterNames();
while(enumee.hasMoreElements()){
System.out.println("enumee:"+enumee.nextElement());
}
}
System.out.println(picture);
return null;
}
}
總結:圖片上傳均是將圖片的字節數據,以HTTP協議(其他編程語言自行定義傳輸協議) 進行數據的傳輸,當服務器接收到後,解析HTTP協議的圖片數據並封裝成Request請求對象,最後通過請求對象便可獲取封裝好的文件對象。(註:當項目配置SpringMVC的文件上傳解析器後,可以在請求方法的參數中傳入Multipart類型變量或解析Request對象。)
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring mvc是如何實現與數據庫的前後端的連接操作的?
- JAVA入門教學之快速搭建基本的springboot(從spring boot到spring cloud)
- Java 微信公眾號開發相關總結
- SSM+微信小程序實現物業管理系統及實例代碼
- Java基礎教程之獲取操作系統及瀏覽器信息