前端使用vue點擊上傳文件傳送給后端并進行文件接收的方法
一、效果圖
前端頁面:


在java這邊后端的target文件就可以接收到前端發(fā)送的文件,文件可以打開
接下來看具體代碼是怎么實現(xiàn)的!
二、代碼部分
Vue代碼
<template>
<el-upload
ref="upload"
class="upload-demo"
action="http://localhost:9090/api/upload" <!--這個為后端響應的路徑-->
: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">上傳到服務器</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
// 如果不想限制可以將這行代碼去掉,以及后面的一些關于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)首先導入依賴
<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)亂碼

這樣子寫就可以實現(xiàn)上面的那種效果啦
總結(jié)
到此這篇關于前端使用vue點擊上傳文件傳送給后端并進行文件接收的文章就介紹到這了,更多相關前端vue點擊上傳文件傳給后端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue2中的el-select組件數(shù)據(jù)太多,如何實現(xiàn)滾動加載數(shù)據(jù)效果
這篇文章主要介紹了vue2中的el-select組件數(shù)據(jù)太多,如何實現(xiàn)滾動加載數(shù)據(jù)效果,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
在vue中使用Echarts利用watch做動態(tài)數(shù)據(jù)渲染操作
這篇文章主要介紹了在vue中使用Echarts利用watch做動態(tài)數(shù)據(jù)渲染操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
基于Vue3+TypeScript的全局對象的注入和使用詳解
這篇文章主要介紹了基于Vue3+TypeScript的全局對象的注入和使用,本篇隨筆主要介紹一下基于Vue3+TypeScript的全局對象的注入和使用,需要的朋友可以參考下2022-09-09
vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名
這篇文章主要介紹了vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
解決VUEX的mapState/...mapState等取值問題
這篇文章主要介紹了解決VUEX的mapState/...mapState等取值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07

