简单说明:图片上传有一个专门的工程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>

SpringBoot图片上传(三)——调用文件上传项目的方法(同时启动两个项目)的更多相关文章

  1. 强大的支持多文件上传的jQuery文件上传插件Uploadify

    支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...

  2. php文件上传之多文件上传

    在胡说之前,首先声明,本文是建立在掌握php单文件上传的基础上,所以这里就不赘述文件上传服务器配置,表单设置该注意的地方了. 话不多少,直入主题,在请求页面方面有两种写法(只呈现表单部分,以上传三个文 ...

  3. SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...

  4. 使用PHP实现文件上传和多文件上传

    PHP 2013 年 9 月 4 日 暂无评论 在PHP程序开发中,文件上传是一个使用非常普遍的功能,也是PHP程序员的必备技能之一.值得高兴的是,在PHP中实现文件上传功能要比在Java.C#等语言 ...

  5. 基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传

    在基于SqlSugar的开发框架的服务层中处理文件上传的时候,我们一般有两种处理方式,一种是常规的把文件存储在本地文件系统中,一种是通过FTP方式存储到指定的FTP服务器上.这种处理应该由程序进行配置 ...

  6. 《如何将windows上的软件包或文件上传到linux服务上》

    昨天晚上朋友让我帮他简单的搭建个环境,他公司让他做款软件测试温度的,他自己搞的是嵌入式,在公司担任的是软件工程师,应届毕业生.也可能他们搞嵌入式的对这个linux系统不太熟,不会把windows上的软 ...

  7. skymvc文件上传支持多文件上传

    skymvc文件上传支持多文件上传 支持单文件.多文件上传 可以设定 文件大小.存储目录.文件类型 //上传的文件目录 $this->upload->uploaddir="att ...

  8. yii2.0单文件上传和多文件上传

    yii2文件上传使用到yii2自带的文件上传类UploadFIle,以及对应的模型规则,这里分别介绍单文件上传和多文件上传: yii2单个文件上传: 上传步奏,先创建上传表单模型model(包含验证规 ...

  9. SpringBoot整合WEB开发--(三)文件上传

    文件上传: Java中文件上传一共涉及到两个组件,CommonsMultipartResolver和StandardServletMultipartResolver,其中CommonsMultipar ...

随机推荐

  1. Spring Cloud微服务Ribbon负载均衡/Zuul网关使用

    客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...

  2. Python——面向对象的特性

    1.继承 定义:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 class A:pass #父类,基类,超类 class ...

  3. Linux交换分区使用过多的处理办法

    处理办法 echo "vm.swappiness=0" >>/etc/sysctl.conf sysctl -p swapoff -a && swapo ...

  4. 从零开始部署javaWeb项目到阿里云上面

    [详情请看]http://www.cnblogs.com/softidea/p/5271746.html 补充几点特别需要注意的事情 一:putty相当于阿里云的控制台, WinSCP 相当于是专门上 ...

  5. 洛谷P1776 宝物筛选

    一道很好的单调队列优化多重背包入门题 令\(v[i]\)表示重量,\(w[i]\)表示价格 ,\(c[i]\)表示最多可放的数量,不难推出朴素的转移方程如下: \(f[i][j]=max\{f[i-1 ...

  6. Python爬虫之二

    1)什么叫做URL url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及 ...

  7. python中os.path.isdir()函数的使用

    在python 中,os.path.isdir(path)函数主要用来判断函数内部的path是否为一个目录 具体关于这个函数的解说参考博客https://blog.csdn.net/xjp_xujip ...

  8. CMDB资产管理系统开发【day25】:表结构设计2

    表结构设计1详细注释代码 # _*_coding:utf-8_*_ __author__ = 'luoahong' from assets.myauth import UserProfile from ...

  9. oldboy s21day10

    #!/usr/bin/env python # -*- coding:utf-8 -*-   # 1.写函数,函数可以支持接收任意数字(位置传参)并将所有数据相加并返回. ''' def func(* ...

  10. JDBC事务管理

    JDBC事务管理 概念回顾: 事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,那么这个业务操作的多个步骤要么同时失败,要么同时成功 事务操作: 开启事务 提交事务 回滚事务 使用Conn ...