Springboot+Vue实现文件上传功能(文件与相关信息同时上传)

Springboot+Vue实现文件与相关信息同时上传

1. 实现方法及思路

1:直接在<el-upload>:action属性中进行字符串拼接。
2:将文件和表单上填写的相关信息添加到ajax的参数中,一并向后台发送。

2. 路径字符串拼接法

  • 缺点:信息长度有限
  • 优点:开发效率高
  1. 前端表单构建
<el-dialog title="upload.title" :visible.sync="dialogVisible" width="800px" append-to-body>
	<el-form :model="docForm" class="demo-input-suffix">
		<el-form-item prop="groupId">
			<el-input v-model="docForm.groupId" :disabled="true">
				<template slot="prepend>群组编号:</template>
			</el-input>
		</el-form-item>
		<el-form-item prop="keywords">
			<el-input v-model="docForm.keywords">
				<template slot="prepend>群组编号:</template>
			</el-input>
		</el-form-item>
		<el-form-item label="上传文件">
			<el-upload
				  ref="upload"
				  accept=".xlsx, .xls"
				  drag
				  action="upload.url + '?groupId=' + docForm.groupId + '&keywords=' + docForm.keywords"
				  :headers="upload.headers"
				  :auto-upload="false"
			>
				<i class="el-icon-upload"></i>
				<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
				<div class="el-upload__tip" slot="tip">仅允许上传xls或xlsx格式文件</div>
			</el-upload>
		</el-form-item>
		<el-form-item>
			<el-button type="primary" @click="submitFileForm">确认上传</el-button>
			<el-button>取消</el-button>
		</el-form-item>
	</el-form>
</el-dialog>

  1. 前端js方法
// 数据
data(){
	return{
		docForm: {
			groupId: 0,
			keywords: ''
		},
		upload: {
			title: "",
			handers: {Authorization: window.sessionStorage.getItem('tokenStorage')}
			url: "/doc/uploadFileWithFormData"
		}
	}
},
// 方法
methods: {
	submitFileForm(){
		this.$refs.upload.submit();
	}
}
  1. 后台接收方法
@ApiOperation(value="参数拼接版-文件上传")
@PostMapping("/uploadFileWithFormData")
public RespBean uploadFile(MultipartFile file,Integer groupId,String keywords) throws Exception{
	return docService.uploadFile(file,groupId,keywords);
}

3. Form-data传参法

  • 需要自己写上传方法,因此<el-upload>控件中不需要action,也不需要headers 。
  • 此方法注意,form-list中存放的是一个一个的对象。form-list对象的.raw才是文件本身,如果直接将form-list中的对象传输到后台,后台接收也必须用object类型。所以这里直接传输文件的二进制文件,关键语句:params.append('file', this.myFileList[0].raw);
  1. 前端表单构建
<el-dialog title="upload.title" :visible.sync="dialogVisible" width="800px" append-to-body>
	<el-form :model="docForm" class="demo-input-suffix">
		<el-form-item prop="groupId">
			<el-input v-model="docForm.groupId" :disabled="true">
				<template slot="prepend>群组编号:</template>
			</el-input>
		</el-form-item>
		<el-form-item prop="keywords">
			<el-input v-model="docForm.keywords">
				<template slot="prepend>群组编号:</template>
			</el-input>
		</el-form-item>
		<!-- 自己写上传方法,不需要action,也不需要headers -->
		<el-form-item label="上传文件">
			<el-upload
				  ref="upload"
				  accept=".xlsx, .xls"
				  drag
				  :on-change = "handleFileChange"
				  :auto-upload="false"
			>
				<i class="el-icon-upload"></i>
				<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
				<div class="el-upload__tip" slot="tip">仅允许上传xls或xlsx格式文件</div>
			</el-upload>
		</el-form-item>
		<el-form-item>
			<el-button type="primary" @click="submitFileForm">确认上传</el-button>
			<el-button>取消</el-button>
		</el-form-item>
	</el-form>
</el-dialog>
  1. 前端js方法
// 数据
data(){
	return{
		docForm: {
			groupId: 0,
			keywords: ''
		},
		myFileList: [], // 用于接收上传的文件
		upload: {
			title: ""
		}
	}
},
// 方法
methods: {
	// 上传方法
	submitFileForm(){
		// 创建上传的formdata
		const params = new FormData();
		// 添加文件
		params.append('file', this.myFileList[0].raw);
		// 添加相关信息
		params.append('groupId',this.docForm.groupId);
		params.append('keywords',this.docForm.keywords);
		this.postRequest('/doc/uploadFileWithFormData1/',params).then(resp=>{
			// 上传成功和上传失败的信息提示
		});
	},
	// 文件变化处理,这里注意<el-upload>的limit不能设为一,否则当再次选择文件时,此方法无法触发!
	handleFileChange(file,fileList){
		this.myFileList.splice(0,this.myFileList.length);
		this.myFileList.push(file);
		// 控件中文件内容更新(删除旧文件)
		if(fileList.length>1){
			this.$refs.upload.uploadFiles.splice(0,1);
		}
	}
}
  1. 后台接收方法
@ApiOperation(value="formData版-文件上传")
@PostMapping("/uploadFileWithFormData1")
public RespBean uploadFile1(MultipartFile file,Integer groupId,String keywords) throws Exception{
	return docService.uploadFile(file,groupId,keywords);
}

附录

  1. Service层处理详情
@Value("${file.fileRootPath}")
private String fileRootPath; // "/fileRoot/"

@Override
@Transactional
public RespBean uploadFile(MultipartFile file,Integer groupId,String keywords) throws IOException {
	/* 1. 将文件保存到服务器指定目录下 */
	// 1.1 创建目录
	String fileDir = fileRootPath+groupId.toString()+"/";
	File fileFatherDir = new File(fileDir);
	if(!fileFatherDir.exists()){
		boolean dirCreateIsSuccess = fileFatherDir.mkdirs();	// 如果路径不存在将创建该路径
		if(dirCreateIsSuccess == false){
			return RespBean.error("文件父目录创建失败");
		}
	}
	// 1.2 将文件信息写入文件系统
	if(!file.isEmpty()){
		// 重组文件名
		String orginalFileName = file.getOriginalFilename();
		String upFileName = orginalFileName;
		// 格式校验
		String fileSuffix = originalFileName.substring(originalFileName.lastIndexOf(".")+1).toUpperCase();
		if(!"XLS".equals(fileSuffix) && !"XLSX".equals(fileSuffix)){
			return RespBean.error("非法的文件格式!");
		}
		// 写入
		InputStream is = file.getInputStream();
		OutputStream os = new FileOutputStream(fileDir+upFileName);	// 保存文件的文件全路径
		int fileUpdateSuccess = FileCopyUtils.copy(is,os);
		if (!fileUpdateSuccess){
			return RespBean.error("文件保存失败,请联系管理员!");
		}
		// 关闭io流
		os.close();
		is.close();
	}
	
	/* 2. 调用存储过程保存相关信息到数据库 */
	// 组织相关信息
	Integer userId = commonUtils.getUserIdFromSecurity();
	String funArgs = String.format("{'xuser_id':'%d','xgroup_id':'%d','xdoc_name':'%s','keywords':'%s','xdoc_path','%s'}",userId,groupId,upFileName,keywords,fileDir) ;
	JSONObject jo = JSON.parseObject(funArgs);
	// 将组织好的信息传入存储过程调用方法(存储过程已存在)
	int uploadSuccess = operateMapper.call("op10000",jo.toJSONString());
	if(!uploadSuccess){
		return RespBean.error("文件信息保存失败");
	}
	
	return RespBean.success("文件上传成功");
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<h3>回答1:</h3><br/>如何实现SpringBoot+Vue文件上传文件上传涉及前端和后端两个方面的实现。 前端的Vue代码: 1. 定义上传文件的模板: ``` <template> <div> <input type="file" @change="handleFileUpload" ref="fileUpload"> <button @click="submitFile">上传文件</button> </div> </template> ``` 2. 在Vue的methods中添加上传文件的方法: ``` methods: { handleFileUpload () { this.file = this.$refs.fileUpload.files[0] }, submitFile () { let formData = new FormData() formData.append('file', this.file) axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then(response => { console.log(response.data) }) } } ``` 这个方法中,我们通过FormData对象来将文件对象上传到服务器端。需要注意的是,在axios请求中,我们需要指定Content-Type为multipart/form-data,以便后端能够正确地解析上传文件。 后端的SpringBoot代码: 1. 配置文件上传的Multipart配置 在application.properties文件中添加以下配置: ``` spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 这个配置指定了上传文件的大小限制,例如,上限设置为10MB。 2. 添加文件上传的Controller ``` @RestController @RequestMapping("/api") public class FileUploadController { @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { try { // 将上传文件保存到指定路径下 String filePath = "C:/uploads/" + file.getOriginalFilename(); file.transferTo(new File(filePath)); return "文件上传成功"; } catch (IOException e) { e.printStackTrace(); return "文件上传失败"; } } } ``` 这个Controller中,通过@RequestParam注解来指定上传文件参数名,再通过MultipartFile来获取上传文件。最后,将文件保存到指定的路径下。需要注意的是,保存路径需要在业务中合理设置。 至此,SpringBoot+Vue文件上传实现就完成了。 <h3>回答2:</h3><br/>Spring Boot是一个广受欢迎的Java开发框架,Vue是一款流行的前端开发框架,他们之间的结合可以为用户提供高效、易用的Web应用程序。在其中,文件上传是Web应用程序的必备功能之一。Spring BootVue的结合可使文件上传实现更加轻松快捷。 首先,需要在前端部分使用Vue来创建一个简单的文件上传组件,该组件可以实现文件选择、文件上传以及进度条的显示等功能。可以使用vue-file-upload或者其他类似的第三方库来实现文件上传功能,同时需要在该组件中设置上传API的路径和上传文件名。 然后,需要在后端部分使用Spring Boot来处理上传文件Spring Boot提供了丰富的文件处理工具和API,可以轻松地实现文件上传。可以使用Spring Boot的MultipartResolver来解析文件上传请求,同时可以使用MultipartFile类来获取上传文件对象。 接着,需要在Spring Boot的Controller中创建一个上传接口用于处理文件上传请求。该接口需要使用@RequestParam注解来获取上传文件对象,并使用MultipartFile类来处理文件上传。同时,还需要设置上传文件的路径,并将上传成功后的文件路径返回到前端。 最后,需要在前端页面使用Vue来处理上传结果。根据上传返回的结果,可以在页面上显示上传成功或者上传失败的提示信息。同时,还可以使用Vue实现进度条的动态更新,用以提醒用户当前的上传状态。 总的来说,Spring BootVue的结合可以实现快速、高效的文件上传功能。借助两个框架提供的强大工具和API,开发者可以轻松地实现文件上传功能,提高Web应用程序的可靠性和用户体验。 <h3>回答3:</h3><br/>SpringBoot是一个基于Spring框架的快速开发微服务的工具,它简化了Spring框架的配置,使开发者可以快速上手。Vue是一款流行的前端框架,它具有高效的组件化开发和数据双向绑定等优点。在实现文件上传功能时,可以结合使用SpringBootVue实现。 首先,需要在SpringBoot的依赖管理文件pom.xml中添加对spring-boot-starter-web和spring-boot-starter-test的引用: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> ``` 然后,在SpringBoot的配置文件application.properties中添加文件上传的配置: ``` spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=200MB spring.servlet.multipart.max-request-size=215MB ``` 接下来,在SpringBoot的Controller中编写文件上传接口: ``` @RestController @RequestMapping("/api") @CrossOrigin(origins = "*", maxAge = 3600) public class UploadController { @PostMapping("/upload") public ResponseResult upload(@RequestParam("file") MultipartFile file) { // 处理文件上传业务逻辑 } } ``` 在Vue的组件中,可以使用vue-axios实现文件上传: ``` <template> <div> <input type="file" @change="uploadFile" /> </div> </template> <script> import axios from 'axios'; export default { data() { return { file: null } }, methods: { uploadFile() { let formData = new FormData(); formData.append('file', this.file); axios.post('http://localhost:8080/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then(res => { console.log(res.data); }) .catch(error => { console.log(error); }) } } } </script> ``` 其中,formData为提交的表单数据,append方法将文件对象添加到表单中。axios.post方法发送POST请求,在请求头中设置Content-Type为multipart/form-data。 总体来说,使用SpringBootVue实现文件上传功能比较简单。通过配置SpringBoot文件上传参数和编写文件上传接口,配合Vue文件上传组件,即可实现文件上传功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值