转载:https://blog.csdn.net/weixin_40337982/article/details/84031778

其中一部分对我很有帮助 转载记录下

首先,html页面:

    <!--form中是要加这个enctype的-->
<form class="form-horizontal" enctype="multipart/form-data"> <div v-if="menu.type == 1" class="form-group">
<div class="col-sm-2 control-label">图片</div>
<div class="col-sm-10">
<div class="ui-upfile">
<div style="width: 150px;height: 140px;display:none;" class="file-area" />
</div>
<input type="hidden" name="menuImgUrl" class="menu-image-url" v-model="menu.menuImgUrl">
<input type='button' class='btn' value='上传图片'οnclick="document.getElementById('file').click()" style=""/>
<input type="file" class="menu-image-url" value="" id="file" @change="onUpload" style="filter:alpha(opacity:0);opacity:0;width:0px">
</div>
</div>
</div>

这里要说明一下,由于使用的是vue,所有这里赋值取值都是使用v-model,然后这里为什么会有这么多input框,

第一个是返回我对象的属性值的;

第二个是手写的一个按钮,因为如果直接使用input type=file的话,样式比较丑,还会有未选择文件那个字样 ,可以那个type=file的input又是必须的。

所以这里我们使用一个button去覆盖type=file的功能,并且把type=file的input隐藏起来,这里的核心代码是:opacity:0;
        接下来,js代码:

    onUpload(e){
var files = e.target.files[];
var formFile = new FormData();
formFile.append("file", files);
$.ajax({
url: baseURL + 'sys/upload/uploadPic',//这里是请求后台的上传文件接口
type: 'POST',
dataType: 'json',
cache: false,
data: formFile,
processData: false,
contentType: false,
success: function(r){ if (r.code === ) {
vm.menu.menuImgUrl = r.fileUrl;
$(".file-area").css("display","block");
$(".file-area").html("<img src= '"+ r.fileUrl +"'>");
}else{
alert("文件上传失败:" + r.msg);
}
}
});
}

由于使用的是vue,所以这里是写在methods下面的。

这里主要是请求后台,把文件传过去,然后返回一个url,通过这个url我们可以直接访问到图片。
后台    UploadController类

@RestController
@RequestMapping("/sys/upload")
public class UploadController extends BaseController { /**
* 上传图片
* @param file
* @param request
* @throws IOException
*/
@RequestMapping( value = "/uploadPic")
@ResponseBody
public R uploadPic(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) throws IOException {
//目前这里是写死的本地硬盘路径
String path = "D:/img";
logger.info("path:" + path);
//获取文件名称
String fileName = file.getOriginalFilename();
//获取文件名后缀
Calendar currTime = Calendar.getInstance();
String time = String.valueOf(currTime.get(Calendar.YEAR))+String.valueOf((currTime.get(Calendar.MONTH)+));
//获取文件名后缀
String suffix = fileName.substring(file.getOriginalFilename().lastIndexOf("."));
suffix = suffix.toLowerCase();
if(suffix.equals(".jpg") || suffix.equals(".jpeg") || suffix.equals(".png")/* || suffix.equals(".gif")*/){
fileName = UUID.randomUUID().toString()+suffix;
File targetFile = new File(path, fileName);
if(!targetFile.getParentFile().exists()){ //注意,判断父级路径是否存在
targetFile.getParentFile().mkdirs();
}
long size = ;
//保存
try {
file.transferTo(targetFile);
size = file.getSize();
} catch (Exception e) {
e.printStackTrace();
return R.error("上传失败!");
}
//项目url,这里可以使用常量或者去数据字典获取相应的url前缀;
String fileUrl="http://localhost:8080";
//文件获取路径
fileUrl = fileUrl + request.getContextPath() + "/img/" + fileName;
logger.info("fileUrl:" + fileUrl);
return R.ok().put("fileUrl", fileUrl);
}else{
return R.error("图片格式有误,请上传.jpg、.png、.jpeg格式的文件");
} }
}

这里有个坑,就是由于spring boot使用的内置tomcat,所以会自动在系统盘下生成一个编译路径,大概是这样的:

C:\Users\\AppData\Local\Temp\tomcat-docbase.6718506550492189172.8080

可是把文件放到这个下面,我们无法去正确获取,而且这里的tomcat生成的文件夹中间那一段数字,还都是在变化的。具体原因没有细究。

经过一天的百度及个人理解,最终决定使用映射;

在application.yml文件中添加要映射的绝对路径,即图片要保存的位置:

    #文件上传
cbs:
imagesPath:
file:/D:/img/

yml文件中格式要求极为严格 ,必须是4个空格,tab键不起作用,直接使用cbs.imagesPath.file也报错。

这里的文件绝对路径就是我们上传文件时写的上传路径;

之后编写WebMvcConfig配置文件;

  @Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{ @Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/login.html");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addViewControllers( registry );
} /**
* 在配置文件中配置的文件保存路径
*/
@Value("${cbs.imagesPath}")
private String mImagesPath; @Bean
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大KB,MB
factory.setMaxFileSize("1024MB");
//设置总上传数据总大小
factory.setMaxRequestSize("1024MB");
return factory.createMultipartConfig();
} /**
* 这里是映射文件路径的方法
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if(mImagesPath.equals("") || mImagesPath.equals("${cbs.imagesPath}")){
String imagesPath = WebMvcConfig.class.getClassLoader().getResource("").getPath();
if(imagesPath.indexOf(".jar")>){
imagesPath = imagesPath.substring(, imagesPath.indexOf(".jar"));
}else if(imagesPath.indexOf("classes")>){
imagesPath = "file:"+imagesPath.substring(, imagesPath.indexOf("classes"));
}
imagesPath = imagesPath.substring(, imagesPath.lastIndexOf("/"))+"/img/";
mImagesPath = imagesPath;
}
registry.addResourceHandler("/img/**").addResourceLocations(mImagesPath);
super.addResourceHandlers(registry);
} }

addResourceHandlers()方法是映射文件路径的方法;

这里我们还需要在权限配置类中添加如下,即放开img下的权限控制,否则会涉及到权限,被拦截;

filterMap.put("/img/**", "anon");

截止到这里,我们的上传图片基本已经完成了,接下来就可以进入测试阶段。

我们把文件上传到D盘下面的img文件夹,上传成功之后,我们使用:

http://localhost:8080/项目名/img/3b13ad02-3812-4c39-880d-799172801284.png

就可以直接访问到我们的图片了。

项目得启动起来。

只是基本的使用,具体的底层原理,并未深究。

点个赞吧!^_^ !

spring boot + vue实现图片上传及展示的更多相关文章

  1. 基于前台vue,后台是spring boot的压缩图片上传

    本人是刚毕业的新手,最近公司的一个项目,前后端分离,前端Vue,后端使用spring boot.其中有一个需求是需要做前端上传的图片需要压缩才能上传.为此在网上查找资料,并做了简单的实现. 那么一步来 ...

  2. SpringMVC+Spring+MyBatis 整合与图片上传简单示例

    一.思路: (一) Dao层: 1. SqlMapConfig.xml,空文件即可.需要文件头.2. applicationContext_dao.xml. a) 数据库连接池b) SqlSessio ...

  3. H5 利用vue实现图片上传功能。

    H5的上传图片如何实现呢? 以下是我用vue实现的图片上传功能,仅供参考. <!DOCTYPE html> <html> <head> <meta chars ...

  4. vue 剪切图片上传头像,使用 cropperjs 实现

    我使用的是vue,移动端的项目. 官网地址:cropperjs GitHub地址:https://github.com/fengyuanchen/cropperjs/blob/master/READM ...

  5. vue+elementUI 图片上传问题

    图片上传问题,获取后台的图片,并点击可以更换图片,并把图片存储到数据库中: (1)在编辑页面上,action指的图片上传的地址,header指请求头: (2)因为element-ui有自己上传的接口, ...

  6. 潭州课堂25班:Ph201805201 tornado 项目 第三课 项目 图片上传,展示 (课堂笔记)

    tornado 相关说明 f增加图片上传功能, 在 main.py ,文件中创建个  UploadHandler 类,用来处理图片上传 上传图片之前,要先渲染这个页面,所以定个 get 方法,把这个页 ...

  7. 微信小程序图片上传并展示

    1.首先编写微信小程序的页面和样式: index.js var total = []; Page({ data: { perImgSrc: [] }, onLoad: function (option ...

  8. Spring Boot入门——多文件上传大小超限问题解决

    多文件上传中遇到上传文件大小的问题 org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededExcepti ...

  9. Spring Boot 嵌入式 Tomcat 文件上传、url 映射虚拟路径

    1.Java web 应用开发完成后如果是导入外置的 Tomcat 的 webapps 目录的话,那么上传的文件可以直接的放在应用的 web 目录下去就好了,浏览器可以很方便的进行访问. 2.Spri ...

随机推荐

  1. uni app 零基础小白到项目实战-1

    uni-app是一个使用vue.js开发跨平台应用的前端框架. 开发者通过编写vue.js代码,uni-app将其编译到Ios,android,微信小程序等多个平台,保证其正确并达到优秀体验. Uni ...

  2. Android Studio一直显示Building“project name”Gradle project info问题详解

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号  欢迎大家关注我的微信公众号:「醉翁猫咪」 Android Studio一直显示 Building&quo ...

  3. 使用ADO.NET

    Program using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  4. 「ZJOI2019」Minmax搜索

    传送门 Solution 叶子节点的变化区间是连续的,可得知非叶子节点的权值变化区间也是连续的 由此可知,\(W\)的变化值的可行域也是连续的,所以只需要看它能否变为\(W+1\)或\(W-1\) 对 ...

  5. 还在用难用的AssetBundle?快来运用Unity新的可寻址资源系统,助力游戏开发

    Unity Addressables可寻址资源系统是一个强大的Unity资源包,它能够帮助解决游戏开发中最重要的一些挑战:高效率和轻松的内容管理. 在管理游戏资源时,往往很难维持好的标准,从而避免让项 ...

  6. Android -------- BouncingJellyView 果冻视图(阻尼效果)

    分享一个不错的效果,分享给大家 BouncingJellyView 果冻视图,就像果冻一样伸缩弹跳,也叫阻尼效果.这个效果在MIUI上面到处都可以看到. 效果图: 使用 项目更目录bulid.grad ...

  7. 本地git工作流

    一:add后的回退代码 1.在原有已经的基础上,又新增加了一个小需求 经过修改,添加到暂存区. 这个时候,会存在modified文件: 2.然后,又说需求不需要存在了 可以进行丢弃 在reset后,需 ...

  8. 【Linux】数据流重定向

    数据流重定向(redirect)就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或设备(打印机之类的).这玩意在Linux的命令行模式下很重要,尤其是想要将某些数据存储下来 ...

  9. PP篇10 修改工单组件行

    CO_XT_COMPONENT_CHANGE 修改工单组件行 DATA : is_order_key TYPE coxt_ord_key, is_order_component_key TYPE co ...

  10. LODOP设置某打印项锁定下边距

    LODOP中的打印项定位都是按照top值(顶边距),left(左边距)来决定的 ,不能直接设置某打印项的下边距.此外,打印项的位置还受PRINT_INTA的前两个整体偏移值,打印机可打区域的影响.该文 ...