這篇文章主要是記錄一下在開發釘釘微應用時,實現圖片上傳及顯示功能的過程。html
這個項目用的dingyou-dingtalk-mobile這個腳手架,可直接在NowaGui上建立。這是一個關於釘釘微應用的腳手架,關於它的介紹以及更詳細的內容,能夠參考https://caohaijiang.github.io/2017/04/17/dingtalk-start/,對於剛入門使用react開發移動前端的同窗仍是頗有幫助的。前端
該項目使用的前端UI是antd-mobile,其用戶手冊能夠參看https://mobile.ant.design/docs/react/introduce-cn,裏面提供了比較豐富的ui組件,基本上能夠知足前端的開發。react
轉到重點,說一下其ImagePicker組件的實際應用。git
前端的使用能夠參考其用戶手冊,有比較詳盡的實例說明,以前在開發時候也比較順利的使用了這個組件,可是在將這個上傳的圖片,如何保存到後臺服務器上,糾結了很多時間。網上看了很多相關文章,可是貌似都沒什麼幫助。github
這邊後端是經過springmvc來處理的,spring
@CrossOrigin( maxAge = 3600) @RequestMapping("/upload") @ResponseBody public String upload(HttpServletRequest request,@RequestParam("file") MultipartFile file) throws IOException
其中MultipartFIle file用來接收前端傳過來的文件,前端應該如何傳遞過來,須要使用FormDate傳遞參數。以下數據庫
for(let key in this.state.files){
let formData = new FormData();
formData.append("file", this.state.files[key].file);
formData.append("dateId", dateId);
formData.append("flag", "1");
fetch(AUTH_URL + "ddoa/upload" , {
method: 'POST',
headers: {
},
body: formData,
}).then((response) => response.json())
.then((responseData)=> {
console.log('uploadImage', responseData);
Control.go("/leavedetail/"+dateId, );
}).catch((err)=> {
this.showToast();
const msg = response.msg;
Toast.info(msg, 2);
});
}
如上,獲取file將其設置到file中,在後臺便可接收到。後端經過json
FileUtils.copyInputStreamToFile(file.getInputStream(),new File(imagePath, imageName));
便可將文件上傳到imagePath指定的目錄中。完成圖片的上傳。此處須要將上傳圖片的相關的信息保存的至一張數據庫表中,該表應該包括圖片名稱、圖片實際路徑、關聯的主表Id等,根據業務進行拓展。後端
以後是將上傳的圖片在頁面中顯示了。服務器
因爲後端是springBoot項目,能夠使用其提供的圖片服務器來顯示圖片。可參考http://www.javashuo.com/article/p-uzbghltg-ew.html來實現。
再須要後端寫一個經過主鍵ID值獲取相應圖片名稱的接口,搭配圖片服務器便可顯示出來了。
前端具體可以下實現
render() { const listForImage = (imagesList) => { let images = []; for(let i = 0; i < imagesList.length; i++) { let m = {url : AUTH_URL + 'images/' + imagesList[i].imageName,id : imagesList[i].id}; images.push( m ); } return images; } const files = listForImage(this.state.imagesList) ; return ( <div> <div style={{display: this.state.imagesList.length == 0 ? 'none' : ''}}> <WhiteSpace size="lg" /> <Card> <Card.Header title={<span><font color="gray"> * </font>圖片</span>} /> <Card.Body style={{width : '90%'}}> <ImagePicker files={files} onImageClick={(index, fs) => console.log(index, fs)} selectable={false} multiple={false} /> </Card.Body> </Card> </div> </div> );
}
componentDidMount() {
fetch( AUTH_URL + "ddoa/getImages" , {
method: 'POST',
headers: {
},
body: formData,
}).then((response) => {
if (response.ok) {
return response.json();
}
}).then((json) => {
const imagesList = json.images;
this.setState({imagesList:imagesList});
}).catch((error) => {
console.error(error);
});
}