簡單說明:圖片上傳有一個專門的工程A,提供了圖片的上傳和下載預覽,工程B涉及到圖片上傳以及回顯,都是調用的工程A的方法,言外之意就是要同時啟動兩個項目。
代碼:
//工程B的html代碼
<div class="col-md-12">
<label class="control-label flex" style="margin-top: 10px;">
上傳圖標<span class="star align-items">*</span>
</label>
<input type="file" name="file" value="上傳圖標" id="fileupload" th:onchange="|fileUpload()|" style="display:none"/>
<img src="/xxxxxx/img/shangchuan.png" alt="" th:onclick="|uploadfile()|" id="imageId" style="margin-top: 10px;"/>
<input type="hidden" id="serviceIcon" name="serviceIcon" class="form-control"/>
</div>
//工程B的js代碼
<script type="text/javascript">
function uploadfile(){
$("#fileupload").trigger("click");
}
//文件上傳
function fileUpload(file){
var myform = new FormData();
myform.append('file', $("#fileupload")[0].files[0]);
var max_size = 512;// 300k
var tmpFile = $("#fileupload").val();
var imgtype = tmpFile.toLowerCase().split('.');
if ((imgtype[1]) != "jpg") {
layer.msg("圖片只支持jpg格式");
tmpFile.value = "";
return false;
} else {
$.ajax({
type:"POST",
url: rootPath + "/serv/service/updatefile",
data:myform,
cache: false,
contentType: false,
processData: false,
dataType: "json",//返回的數據格式
async: false,
success: function (data) {
if(data==="1" ){
layer.msg("上傳失敗,圖片內存過大");
}else if(data=="2"){
layer.msg("上傳失敗,圖片內存過大");
}else{
var path="/oh-manager/"+data;
//IP是文件上傳項目A在服務器的地址 upload是controller的注解 showPic是方法
var imgPlanIcon ='http://10.131.103.220:8590/upload/showPic?ppath=' + data;
$('#imageId').attr('src', imgPlanIcon);
$('#serviceIcon').val(data);
}
},
error: function (jqXHR, textStatus, errorThrown) {
}
});
}
return false;
}
</script>
//工程B的后台java代碼 @RequestMapping(value="/updatefile")
public @ResponseBody String updatefile(@RequestParam("file") MultipartFile file,
HttpServletRequest request) {
// 創建httpclient對象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 創建post方式請求對象 請求地址是工程A的文件上傳方法upimgs
HttpPost httpPost = new HttpPost("http://10.131.103.220:8590/upload/upimgs");
String fileName = file.getOriginalFilename();
String filePath = "D:/image/temp";
try {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
builder.addTextBody("filename", fileName);// 類似瀏覽器表單提交,對應input的name和value
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost);
// 獲取響應對象
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
// 打印響應內容
String aa=EntityUtils.toString(resEntity, Charset.forName("UTF-8"));
JSONObject data2 = JSONObject.fromObject(aa);
fileName=data2.getString("title");
}
// 銷毀
EntityUtils.consume(resEntity);
File targetFile = new File(filePath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
File fileRoute = new File(filePath+"/"+fileName);
BufferedImage sourceImg =ImageIO.read(fileRoute);
Long size = file.getSize() / 1024; // 圖片大小
int wid=sourceImg.getWidth(); // 源圖寬度
int hei=sourceImg.getHeight(); // 源圖高度
if(size>512){
fileName="1";
}
if(wid>60 || hei>60){
fileName="2";
}
} catch (Exception e) {
// TODO: handle exception
}
//返回json
return fileName;//返回js的成功回調函數
}
//工程A的上傳方法upload/upimgs @RequestMapping(path="/upimgs", method=RequestMethod.POST,produces = "application/json;charset=utf-8")
@ResponseBody
//@CrossOrigin("*") //可跨域訪問
// public String uploadImgs(HttpServletRequest request) throws IllegalStateException, IOException {
public FileSaveResult uploadImgs(HttpServletRequest request) throws IllegalStateException, IOException {
// String reResult="";
FileSaveResult reResult = null;
try {
reResult = FileSaveUtil.uploadImg(request);
} catch (IllegalStateException e) {
logger.error(e,e);
e.printStackTrace();
} catch (IOException e) {
logger.error(e,e);
e.printStackTrace();
}
return reResult;
}
//FileSaveUil工具類里的圖片上傳方法
public static FileSaveResult uploadImg(HttpServletRequest request) throws IllegalStateException, IOException {
logger.info("文件正在被上傳,請稍等...");
boolean flag = false;
// Map<String, Object> result = new HashMap<String, Object>();
FileSaveResult result = null;
String prePath = request.getParameter("prePath");
/* if (StringUtil.getNullStr(prePath).equals("") || StringUtil.getNullStr(prePath).equals("null")) {
// result.put("state", "false");
// result.put("msg", "圖片存放前置路徑不可為空!");
// JSONObject jo = JSONObject.fromObject(result);
// return jo.toString();
result = new FileSaveResult(
FileSaveResultConstant.STATE_UPLOAD_FILE_PREPATH_EMPTY_CODE,
FileSaveResultConstant.STATE_UPLOAD_FILE_PREPATH_EMPTY_CODE_MSG);
return result;
}*/
// 創建一個通用的多部分解析器
String filePath = FileuploadEnv.getFileImgPath();
String path = "";
String suffix = "";
// 當前上傳文件的文件名稱
String myFileName = "";
// 圖片大小
long size = 0;
// 重命名上傳后的文件名
String fileName = "";
float rate= 1.0f;
// 判斷 request 是否有文件上傳,即多部分請求
if (request instanceof MultipartHttpServletRequest) { //multipartResolver.isMultipart(request)
// 轉換成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上傳文件
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null && !file.isEmpty()) {
// 取得當前上傳文件的文件名稱
myFileName = file.getOriginalFilename();
// 獲取文件后綴
suffix = FileType.getSuffixByFilename(myFileName);
// 圖片擴展名判定
boolean judgeResult = FileExtensionUtil.fileExtensionJudge(suffix);
if (!judgeResult) {
logger.info("上傳的圖片資源格式不正確,不可上傳。圖片格式:" + suffix + ", 格式限制:" + FileExtensionUtil.IMG_SUFFIX);
result = new FileSaveResult(
FileSaveResultConstant.STATE_UPLOAD_FILE_EXTENSION_NOT_ALLOWD_CODE,
FileSaveResultConstant.STATE_UPLOAD_FILE_EXTENSION_NOT_ALLOWD_CODE_MSG);
return result;
}
// 獲取圖片大小
/*size = file.getSize();
if (size > 5217880) { // 5M*1024*1024
result.put("state", "false");
result.put("msg", "圖片文件過大,請壓縮至5M以下!");
JSONObject jo = JSONObject.fromObject(result);
return jo.toString();
}*/
size = file.getSize();
if (size > 1043576) { // 1M*1024*1024
float s1=size/1043576.0f;
rate=1.0f/s1;
}
// 如果名稱不為“”,說明該文件存在,否則說明該文件不存在
if (myFileName.trim() != "") {
// 重命名上傳后的文件名
fileName = UuidUtil.get32Uuid() + suffix;
// 從配置文件獲得上傳路徑
String parentPath = filePath + "/";
path = parentPath + "/" + fileName;
File parentFile = new File(parentPath);
File localFile = null;
if (!parentFile.exists()) { // 如果父目錄不存在,那么創建父目錄
parentFile.mkdirs();
}
localFile = new File(path);
file.transferTo(localFile);
// 壓縮圖片
CompressPic.reduceImg(path, localFile, 0, 0, rate, suffix);
flag = true;
} else {
// result.put("state", "false");
// result.put("msg", "文件為空!");
// JSONObject jo = JSONObject.fromObject(result);
// return jo.toString();
result = new FileSaveResult(
FileSaveResultConstant.STATE_UPLOAD_FILE_EMPTY_CODE,
FileSaveResultConstant.STATE_UPLOAD_FILE_EMPTY_CODE_MSG);
return result;
}
}
}
if (flag) {
// result.put("state", "SUCCESS");
// result.put("msg", "操作成功!");
// result.put("url", prePath + "/" + fileName); // 文件保存路徑
// result.put("original", myFileName);// 取得當前上傳文件的文件名稱
// result.put("size", size);
// result.put("type", suffix); // 文件后綴,如.jpg
// result.put("title", fileName); // 保存后的文件名稱
// JSONObject jo = JSONObject.fromObject(result);
// return jo.toString();
result = new FileSaveResult(
FileSaveResultConstant.STATE_UPLOAD_SUCCESS_CODE,
FileSaveResultConstant.STATE_UPLOAD_SUCCESS_CODE_MSG, prePath + "/" + fileName, myFileName, size, suffix, fileName);
logger.info("圖片上傳成功,url:" + result.getUrl());
return result;
}else{
// result.put("state", "false");
// result.put("msg", "上傳失敗!");
// JSONObject jo = JSONObject.fromObject(result);
// return jo.toString();
result = new FileSaveResult(
FileSaveResultConstant.STATE_UPLOAD_FAILED_CODE,
FileSaveResultConstant.STATE_UPLOAD_FAILED_CODE_MSG);
return result;
}
}else{
// result.put("state", "false");
// result.put("msg", "上傳失敗-MultipartFile類型有誤!");
// JSONObject jo = JSONObject.fromObject(result);
// return jo.toString();
result = new FileSaveResult(
FileSaveResultConstant.STATE_UPLOAD_FILE_REQUEST_ERROR_CODE,
FileSaveResultConstant.STATE_UPLOAD_FILE_REQUEST_ERROR_CODE_MSG);
return result;
}
}
//工程A的下載回顯方法upload/showPic
@RequestMapping(path="/showPic", method=RequestMethod.GET,produces = "application/json;charset=utf-8")
public void showPic(String ppath, HttpServletResponse response) {
FileInputStream hFile = null;
if (!ppath.equals("") && !ppath.equals("/")) {
try {
// 去除路徑中的回溯 ../
ppath = ppath.replace("../", "");
// 拼接圖片資源路徑
String prePath = FileuploadEnv.getFileImgPath();
String imgFileUrl = prePath + "/" + ppath;
System.out.println("imgFileUrl 完整路徑:" + imgFileUrl);
// 打開文件
File file = new File(imgFileUrl);
// 驗證打開的文件是否是在 prePath 目錄下,若不是,不做任何處理
String openedFileAbsolutPath = file.getAbsolutePath();
logger.info("打開的文件絕對路徑:" + openedFileAbsolutPath);
if (!openedFileAbsolutPath.contains(openedFileAbsolutPath)) {
logger.info("訪問的圖片資源不在指定目錄之下,不可返回。打開的文件絕對地址:" + openedFileAbsolutPath);
return;
} else {
logger.info("訪問的圖片資源在指定目錄之下,可以返回。");
}
// 圖片擴展名判定
String suffix = FileType.getSuffixByFilename(openedFileAbsolutPath);
boolean judgeResult = FileExtensionUtil.fileExtensionJudge(suffix);
if (!judgeResult) {
logger.info("訪問的圖片資源格式不正確,不可返回。圖片格式:" + suffix + ", 格式限制:" + FileExtensionUtil.IMG_SUFFIX);
return;
}
// hFile = new FileInputStream(imgFileUrl); // 以byte流的方式打開文件 d:\1.gif
hFile = new FileInputStream(file); // 以byte流的方式打開文件 d:\1.gif
int i = hFile.available(); // 得到文件大小
byte data[] = new byte[i];
hFile.read(data); // 讀數據
response.setContentType("image/*"); // 設置返回的文件類型
OutputStream toClient = response.getOutputStream(); // 得到向客戶端輸出二進制數據的對象
toClient.write(data); // 輸出數據
toClient.flush();
toClient.close();
hFile.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (hFile != null) {
hFile.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
return;
}
}
犯的錯誤總結:請求工程A的upimgs或者showPic方法的時候,地址一定要加上 http://Ip地址/要訪問的Controller/要訪問的方法
即使工程A是在本地,也需要地址也是http://本機IP/要訪問的Controller/要訪問的方法(相對路徑) 一定不要加上什么E盤工作空間工程名稱,這樣的話就訪問不到,直接就是ip地址+controller+方法,加E盤/·····這是絕對路徑
因為是工程B調用工程A的方法,所以要同時運行兩個項目。
http://10.131.103.220:8590/upload/showPic或者upimgs upload是工程A的@Controller@RequestMapping("/upload")注解里的值
進入頁面需要回顯圖片的時候,就把數據庫中查到的圖片名字傳遞到前台頁面,在前台中加入js:
<script type="text/javascript" th:inline="javascript" xmlns:th="http://www.w3.org/1999/xhtml">
//接收前台傳遞過來的圖片名字
var serviceIcon = [[${serviceIcon}]];
if (CommnUtil.notNull(serviceIcon)) {
var imgname = serviceIcon.split("/");
var imgPlanIcon = 'http://10.131.103.220:8590/upload/showPic?ppath=icon/' + imgname[imgname.length - 1];
$("#imageId").attr('src', imgPlanIcon);
$('#serviceIcon').val(imgname[imgname.length - 1]);
}
</script>