Vue+SSM實(shí)現(xiàn)圖片上傳預(yù)覽效果
現(xiàn)在的需求是:有一個(gè)上傳文件按鈕,當(dāng)我們點(diǎn)擊按鈕時(shí),可以選擇需要上傳的文件,確定后圖片顯示在界面上。
說(shuō)明:本項(xiàng)目前端使用的Vue,后臺(tái)用的SSM搭建的,服務(wù)器是Tomcat,數(shù)據(jù)庫(kù)是MySQL
實(shí)現(xiàn)思路:
前端界面:當(dāng)用戶(hù)點(diǎn)擊上傳文件按鈕,選中待上傳圖片并點(diǎn)擊確認(rèn)后,這時(shí)應(yīng)該把圖片數(shù)據(jù)傳給后臺(tái)。當(dāng)后臺(tái)經(jīng)過(guò)處理后返回結(jié)果,前端在根據(jù)響應(yīng)結(jié)果做后續(xù)工作。
后端:后臺(tái)拿到前端傳過(guò)來(lái)的數(shù)據(jù)時(shí),將圖片文件存到固定的文件夾下(這個(gè)問(wèn)題是我思考了很久的,我認(rèn)為應(yīng)該存在服務(wù)器下,原先我是存在本地文件夾下,然后用路徑去引,這樣說(shuō)實(shí)話(huà)真的好笨,遇到了好多問(wèn)題,搞了好久,被自己蠢哭)。文件存入后,返回響應(yīng)結(jié)果。如果成功直接返回當(dāng)前圖片的相對(duì)路徑,然后前端根據(jù)這個(gè)路徑展示圖片。
現(xiàn)在主要思考的問(wèn)題是如何將圖片資源放在Tomcat下。
實(shí)現(xiàn)這個(gè)問(wèn)題,我是在Tomcat下創(chuàng)建了一個(gè)虛擬目錄,今后所有的圖片文件視頻等資源都放在這個(gè)目錄文件夾下
后端實(shí)現(xiàn)上傳圖片步驟如下:
1. 在Tomcat下創(chuàng)建虛擬目錄
在tomcat的根目錄下創(chuàng)建一個(gè)名為FileDir的目錄(當(dāng)然這個(gè)目錄也可以建立在其它的地方)

在tomcat的conf/server.xml,配置虛擬目錄。增加下面這行
<Context path="/FileDir" docBase="G:\安裝包\Tomcat\安裝包\Tomcat 7.0\FileDir"/>

添加一張圖片1.jpg到虛擬目錄中,并啟動(dòng)tomcat測(cè)試。訪問(wèn):http://localhost:8080/FileDir/1.jpg??梢哉?qǐng)求到圖片,說(shuō)明配置成功。
2. 后端配置
引入文件上傳下載jar包:commons-fileupload-1.3.2.jar和commons-io-1.3.2.jar

編寫(xiě)SpringMVC配置文件,添加如下代碼:
<!-- 配置文件上傳解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設(shè)置請(qǐng)求編碼格式 --> <property name="defaultEncoding" value="UTF-8"></property> </bean>
創(chuàng)建一個(gè)用于文件上傳的控制器類(lèi)FileUploadController
package com.wyf.controller;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.wyf.po.Result;
import com.wyf.service.FileServlet;
/**
* 文件上傳控制器
*
* @author ASUS
*
*/
@RestController
public class FileUploadController {
@Autowired
private FileServlet fileServlet;
/**
* 執(zhí)行圖片上傳
*
* 解決前端獲取后臺(tái)數(shù)據(jù)中文亂碼:produces={"application/json;charset=UTF-8"}
*/
@RequestMapping(value = "/uploadImg", method = RequestMethod.POST, produces = { "application/json;charset=UTF-8" })
public Result handleUploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
// 判斷所上傳文件是否存在
if (!file.isEmpty()) {
// 獲取文件上傳的原始名稱(chēng)
String originalFilename = file.getOriginalFilename();
//存儲(chǔ)圖片的路徑
String rootPath = "G:\\安裝包\\Tomcat\\安裝包\\Tomcat 7.0\\FileDir\\";
// 設(shè)置上傳文件的保存地址目錄
String path = "\\upload\\images\\applyShop";
String dirPath = rootPath + path + "\\";
File filePath = new File(dirPath);
// 如果保存文件的地址不存在,就先創(chuàng)建目錄
if (!filePath.exists()) {
filePath.mkdirs();
}
// 重新命名
String newFileName = UUID.randomUUID() + "_" + originalFilename;
try {
// 使用MultipartFile接口的方法完成文件上傳到指定位置
file.transferTo(new File(dirPath + newFileName));
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "上傳錯(cuò)誤");
}
// 返回相對(duì)路徑
String srcPath = path + "\\" + newFileName;
fileServlet.addUploadFIle(srcPath);
return new Result(true, srcPath);
}
return new Result(false, "文件不存在");
}
}
這里用了一個(gè)Result類(lèi)來(lái)返回?cái)?shù)據(jù),用來(lái)封裝返回的結(jié)果信息,以JSON格式返回給前端。代碼如下:
public class Result {
private boolean flag;//處理結(jié)果標(biāo)識(shí)
private String message;//返回的結(jié)果信息
/* 省略get()和set()*/
}
前端Vue界面,發(fā)送請(qǐng)求給后臺(tái)后,通過(guò)動(dòng)態(tài)綁定src屬性,獲取拿到的圖片路徑
<template>
<div class="upload">
<div class="img-container">
<!-- 上傳預(yù)覽圖片 -->
<img :src="src" alt />
</div>
<!-- 文件上傳的input -->
<form class="input-file" enctype="multipart/form-data" method="post">
<input type="file" ref="upload" name="uploadImg" id="file" @change="getFile" multiple />
<!-- label一個(gè) for 屬性指向input的唯一 id ,這樣點(diǎn)擊label就相當(dāng)于點(diǎn)擊input -->
<label for="file">上傳圖片</label>
</form>
</div>
</template>
<script>
export default {
data() {
return {
src:require('../../assets/dist/images/admin.jpg'),
srcPath:''//圖片相對(duì)路徑
};
},
methods: {
getFile(e) {
let files = e.target.files[0]; //獲取上傳圖片信息
let formData = new FormData()
formData.append('file',files)
this.$axios.post("/api/uploadImg",formData).then(result=>{
if(result.data.flag){
this.srcPath = result.data.message
this.src = `/imgURL${this.srcPath}`
}else{
console.log(result.data.message)
}
})
}
}
};
</script>
到這一步,基本能實(shí)現(xiàn)圖片的上傳和預(yù)覽。但是有bug,中文亂碼問(wèn)題。如果圖片路徑帶中文,src解析不出來(lái),這個(gè)問(wèn)題我也解決了很久。
找了各種百度,最后還是用的修改tomcat的server.xml配置文件方法。
我思考了一下出現(xiàn)亂碼的原因,因?yàn)槲业膱D片資源是通過(guò)訪問(wèn)tomcat拿到的,所以當(dāng)img標(biāo)簽動(dòng)態(tài)綁定后臺(tái)傳過(guò)來(lái)的路徑時(shí),提交的方式是get請(qǐng)求。前臺(tái)拿到的路徑中文是正確的,但是在tomcat下就會(huì)亂碼,tomcat默認(rèn)的編碼方式是iso8859-1對(duì)中文編碼,而前端設(shè)置的編碼方式是utf-8,所以就出現(xiàn)了亂碼。
我的解決辦法是修改tomcat的server.xml配置文件
在tomcat的server.xml中找到
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
將這行修改為
<!--解決地址欄輸入中文亂碼問(wèn)題在<Connector中加入 useBodyEncodingForURI="true" URIEncoding="UTF-8" --> <!--useBodyEncodingForURI="true":代表get和post請(qǐng)求用一樣的編碼 --> <!--URIEncoding="UTF-8":請(qǐng)求編碼為utf-8 --> <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)codemirror代碼編輯器中的SQL代碼格式化功能
這篇文章主要介紹了vue實(shí)現(xiàn)codemirror代碼編輯器中的SQL代碼格式化功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Vue3中實(shí)現(xiàn)發(fā)送網(wǎng)絡(luò)請(qǐng)求功能(最新推薦)
Axios是一個(gè)基于Promise的HTTP客戶(hù)端,可以在瀏覽器和Node.js中用于發(fā)送HTTP請(qǐng)求,本文主要介紹在Vue3中實(shí)現(xiàn)發(fā)送網(wǎng)絡(luò)請(qǐng)求功能,感興趣的朋友一起看看吧2023-12-12
vue項(xiàng)目實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了vue項(xiàng)目實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
Vue+ElementUI技巧之自定義表單項(xiàng)label的文字提示方法
這篇文章主要給大家介紹了關(guān)于Vue+ElementUI技巧之自定義表單項(xiàng)label文字提示的相關(guān)資料,文中通過(guò)圖文以及代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
vue+element-ui+sortable.js實(shí)現(xiàn)表格拖拽功能
這篇文章主要為大家詳細(xì)介紹了vue+element-ui+sortable.js實(shí)現(xiàn)表格拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
vue3實(shí)現(xiàn)數(shù)字滾動(dòng)特效實(shí)例詳解
這篇文章主要為大家介紹了vue3實(shí)現(xiàn)數(shù)字滾動(dòng)特效實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
vue引入element-ui之后,頁(yè)面是空白的問(wèn)題及解決
這篇文章主要介紹了vue引入element-ui之后,頁(yè)面是空白的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

