前端使用vue點(diǎn)擊上傳文件傳送給后端并進(jìn)行文件接收的方法
一、效果圖
前端頁面:
在java這邊后端的target文件就可以接收到前端發(fā)送的文件,文件可以打開
接下來看具體代碼是怎么實(shí)現(xiàn)的!
二、代碼部分
Vue代碼
<template> <el-upload ref="upload" class="upload-demo" action="http://localhost:9090/api/upload" <!--這個(gè)為后端響應(yīng)的路徑--> :on-success="handleSuccess" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false" :on-change="handleChange" > <el-button slot="trigger" size="small" type="primary">選取文件</el-button> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上傳到服務(wù)器</el-button> <div slot="tip" class="el-upload__tip">只能上傳xlsx/xls文件,且不超過500kb</div> </el-upload> </template> <script> export default { // ... 其他代碼保持不變 data() { return { fileList: [] }; }, methods: { handleSuccess(response, file, fileList) { console.log('文件上傳成功:', response); }, beforeUpload(file) { // 限制格式為excel // 如果不想限制可以將這行代碼去掉,以及后面的一些關(guān)于excel的判斷 const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.type === 'application/vnd.ms-excel'; // 限制文件大小 const isLt2M = file.size / 1024 / 1024 < 0.5; if (!isExcel) { this.$message.error('上傳文件只能是 xls/xlsx 格式!'); } if (!isLt2M) { this.$message.error('上傳文件大小不能超過 500KB!'); } return isExcel && isLt2M; }, submitUpload() { // 這邊的$refs.upload要與上面第三行的ref一致 this.$refs.upload.submit(); }, handleRemove(file, fileList) { console.log('移除文件', file, fileList); }, handleChange(file, fileList) { this.fileList = fileList; } } }; </script>
后端代碼
(1)首先導(dǎo)入依賴
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency>
(2)controller層(也可以在servlet寫)
@RequestMapping(value = "/upload") public void handleFileUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException{ // 檢查請求是否為多部分請求 if (!ServletFileUpload.isMultipartContent(request)) { throw new ServletException("Content type is not multipart/form-data"); } // 配置上傳參數(shù) DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { // 解析請求的內(nèi)容提取文件數(shù)據(jù) List<FileItem> formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { // 迭代表單數(shù)據(jù) for (FileItem item : formItems) { // 處理不在表單中的字段 if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); //下面的路徑就是你要映射到target的路徑 String filePath = request.getServletContext().getRealPath("/") + "WEB-INF"+File.separator+"static" + File.separator + fileName; File storeFile = new File(filePath); // 在控制臺輸出文件的上傳路徑 System.out.println(filePath); System.out.println("編碼前的原文: " + fileName); //這一條在控制臺打印可能會出現(xiàn)字符編碼的問題,如浣撴浜哄憳淇℃伅.xlsx //這種是gbk編碼,接下來就將gbk解碼為utf-8 byte[] gbkBytes = fileName.getBytes("gbk"); for (byte b : gbkBytes) { System.out.print(Integer.toHexString(b & 0xff) + ","); } String gbkToUtf8 = new String(gbkBytes, "utf8"); System.out.println("gbk編碼,utf8解碼后的文字: " + gbkToUtf8 + "\n" + "----------------------"); // 保存文件到硬盤 item.write(storeFile); request.setAttribute("message", "文件上傳成功!"); } } } } catch (Exception ex) { request.setAttribute("message", "文件上傳失敗!"); } }
這樣子字符編碼就不會出現(xiàn)亂碼
這樣子寫就可以實(shí)現(xiàn)上面的那種效果啦
總結(jié)
到此這篇關(guān)于前端使用vue點(diǎn)擊上傳文件傳送給后端并進(jìn)行文件接收的文章就介紹到這了,更多相關(guān)前端vue點(diǎn)擊上傳文件傳給后端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vue+elementui項(xiàng)目打包后樣式變化問題
這篇文章主要介紹了解決vue+elementui項(xiàng)目打包后樣式變化問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08vue2中的el-select組件數(shù)據(jù)太多,如何實(shí)現(xiàn)滾動(dòng)加載數(shù)據(jù)效果
這篇文章主要介紹了vue2中的el-select組件數(shù)據(jù)太多,如何實(shí)現(xiàn)滾動(dòng)加載數(shù)據(jù)效果,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04在vue中使用Echarts利用watch做動(dòng)態(tài)數(shù)據(jù)渲染操作
這篇文章主要介紹了在vue中使用Echarts利用watch做動(dòng)態(tài)數(shù)據(jù)渲染操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07基于Vue3+TypeScript的全局對象的注入和使用詳解
這篇文章主要介紹了基于Vue3+TypeScript的全局對象的注入和使用,本篇隨筆主要介紹一下基于Vue3+TypeScript的全局對象的注入和使用,需要的朋友可以參考下2022-09-09vue修改打包配置如何實(shí)現(xiàn)代碼打包后的自定義命名
這篇文章主要介紹了vue修改打包配置如何實(shí)現(xiàn)代碼打包后的自定義命名,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05解決VUEX的mapState/...mapState等取值問題
這篇文章主要介紹了解決VUEX的mapState/...mapState等取值問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07