1. 程式人生 > >springmvc上傳圖片通用介面

springmvc上傳圖片通用介面

這裡介紹一下工作中做上傳圖片的體會,工作中是將選擇圖片之後非同步上傳到伺服器,返回一個在伺服器儲存的圖片路徑,然後賦值到一個隱藏域裡,提交表單的時候,再去執行存資料庫的操作。

個人感覺這種上傳圖片的方式要比把表單資料和圖片一起提交要好一點。

直接來看程式碼,這裡只展示controller層

import cn.util.DateUtils;
import cn.util.ResponseResult;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Controller層
 * @author Rhine
 *
 */


@Controller
@RequestMapping("api/file/")
public class UploadController {

	/**
	 * 非同步上傳圖片
	 * @param files
	 * @return
	 * @throws IOException
	 * @throws IllegalStateException
     * ResponseResult 是自己定義的返回值物件,可隨便定義
	 */
	@RequestMapping(value = "upload",method = RequestMethod.POST)
	@ResponseBody
	public ResponseResult uploadFiles(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) throws IllegalStateException, IOException {
		//支援多圖片上傳
        String result = "";
		for(int i=0;i<files.length;i++){
			if (!files[i].isEmpty()) {

                        //獲得原始檔名;
				String fileRealName = files[i].getOriginalFilename();                   


                        //根據圖片名稱獲取一個hash值,算出來的值作為檔案路徑
				/**********************************************/
				int hashcode = fileRealName.hashCode();//得到hashCode

				int dir1 = hashcode & 0xf; //得到名為1到16的下及資料夾

				int dir2 = (hashcode & 0xf0) >> 4; //得到名為1到16的下下及資料夾

                        //獲取伺服器指定檔案存取路徑,我的fileupload在webapp下
				String savedDir = request.getSession().getServletContext().getRealPath("fileupload"); 

				String dir = savedDir + "/" + dir1 + "/" + dir2; //得到檔案路徑


				/****************************************************/
                        //點號的位置
				int pointIndex =  fileRealName.indexOf(".");     
                        //擷取檔案字尾                   
				String fileSuffix = fileRealName.substring(pointIndex);             

				String filePreName="";
                        //獲取檔名不帶字尾名
				filePreName=fileRealName.substring(0,fileRealName.lastIndexOf("."));  

				String date = DateUtils.getDate("yyyyMMddHHmmss");
                
                        //檔案存取名
				String savedFileName = filePreName + "_" +date.concat(fileSuffix);       

				File file2 = new File(dir); 	//建立資料夾 如果不存在
				if(!file2.exists()){
					file2.mkdirs();

					System.out.println(dir);
					System.out.println("建立資料夾成功======================"+dir);
				}

				File savedFile = new File(dir,savedFileName );
				boolean isCreateSuccess = savedFile.createNewFile();
				if(isCreateSuccess){
					files[i].transferTo(savedFile);  //轉存檔案
				}
				String filepath = "/fileupload/" + dir1 + "/" + dir2+ "/" +savedFileName;
				result = result+ filepath + ",";
			}
		}

                //多個檔案以逗號分隔,然後去掉最後一個逗號
		result = result.substring(0,result.length()-1);
		return ResponseResult.ok(result);
	}
	
}

前端呼叫之後,返回一個字串,多個圖片路徑以逗號分隔開。