使用antd-mobile的ImagePicker組件實現圖片的上傳

這篇文章主要是記錄一下在開發釘釘微應用時,實現圖片上傳及顯示功能的過程。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);  
        }); 


    }    
相關文章
相關標籤/搜索