angular-file-upload+springMVC的使用

最近項目中須要用到文件上傳,使用了angular-file-upload插件完成javascript

首先來介紹下這個插件的一些屬性(參考官方文檔)html

FileUploader

屬性

  • url {String}: 上傳文件的服務器路徑
  • alias {String}:  包含文件的名稱,默認是file
  • queue {Array}: 上傳隊列
  • progress {Number}: 上傳隊列的進度,只讀
  • headers {Object}: 上傳的頭文件信息, 瀏覽器需支持HTML5
  • formData {Array}: 與文件一塊兒發送的表單數據
  • filters {Array}: 在文件加入上傳隊列以前應用過濾器.,若是過濾器返回true則文件加入隊列中
  • autoUpload {Boolean}: 文件加入隊列以後自動上傳,默認是false
  • method {String}: 請求方式,默認是POST,瀏覽器需支持HTML5
  • removeAfterUpload {Boolean}: 文件上傳成功以後從隊列移除,默認是false
  • isHTML5 {Boolean}: 若是瀏覽器支持HTML5上傳則返回true,只讀
  • isUploading {Boolean}: 文件正在上傳中返回true,只讀
  • queueLimit {Number} : 最大上傳文件數量(預約義)
  • withCredentials {Boolean} : 使用CORS,默認是false, 瀏覽器需支持HTML5

方法

  • addToQueue function(files[, options[, filters]]) {: Add items to the queue, where files is a {FileList|File|HTMLInputElement}options is an {Object} andfilters is a {String}.  添加項到上傳隊列中,files 是 {FileList|File|HTMLInputElement}, options 是 {Object} 以及 filters 是 {String}
  • removeFromQueue function(value) {: Remove an item from the queue, wherevalue is {FileItem} or index of item.  從上傳隊列移除項,value 能夠是 {FileItem} 或者項的序號
  • clearQueue function() {: Removes all elements from the queue.  移除上傳隊列全部的元素
  • uploadItem function(value) {: Uploads an item, where value is {FileItem} or index of item.  上傳項, value 能夠是 {FileItem} 或者項的序號
  • cancelItem function(value) {: Cancels uploading of item, where value is{FileItem} or index of item.  取消上傳的項
  • uploadAll function() {: Upload all pending items on the queue.  將上傳隊列中全部的項進行上傳
  • cancelAll function() {: Cancels all current uploads.  取消全部當前上傳
  • destroy function() {: Destroys a uploader. 
  • isFile function(value) {return {Boolean};}: Returns true if value is {File}
  • isFileLikeObject function(value) {return {Boolean};}: Returns true if value is{FileLikeObject}.
  • getIndexOfItem function({FileItem}) {return {Number};}: Returns the index of the{FileItem} queue element.  返回項在上傳隊列中的序號
  • getReadyItems function() {return {Array.<FileItems>};}: Return items are ready to upload.  返回準備上傳的項
  • getNotUploadedItems function() {return {Array.<FileItems>};}: Return an array of all pending items on the queue  返回上傳隊列中未上傳的項

回調函數

  • onAfterAddingFile function(item) {: 添加文件到上傳隊列後
  • onWhenAddingFileFailed function(item, filter, options) {: 添加文件到上傳隊列失敗後
  • onAfterAddingAll function(addedItems) {: 添加所選的全部文件到上傳隊列後
  • onBeforeUploadItem function(item) {: 文件上傳以前
  • onProgressItem function(item, progress) {: 文件上傳中
  • onSuccessItem function(item, response, status, headers) {: 文件上傳成功後
  • onErrorItem function(item, response, status, headers) {: 文件上傳失敗後
  • onCancelItem function(item, response, status, headers) { - 文件上傳取消後
  • onCompleteItem function(item, response, status, headers) {: 文件上傳完成後
  • onProgressAll function(progress) {: 上傳隊列的全部文件上傳中
  • onCompleteAll function() {: 上傳隊列的全部文件上傳完成後

使用

固然首先須要加入插件的jsjava

bowerweb

bower install angular-file-upload

 在頁面導入js數組

<script src="bower_components/angular-file-upload/dist/angular-file-upload.min.js"></script>
加入angularFileUpload
var myapp = angular.module('add',['angularFileUpload'])

 html

我這裏是上傳的圖片因此代碼以下:瀏覽器

 

 1 <div ng-controller="addProduct">
 2 <div>
 3    <lable>產品名稱</lable>
 4    <input type="text" ng-model="productInfo.name">
 5 </div>
 6 <div>
 7 <lable>產品型號</lable>
 8  <input type="text" ng-model="productInfo.type">
 9 </div>
10 <div>
11 <lable>產品圖片</lable>
12 <input type="file" name="photo" nv-file-select=""  uploader="uploader" accept="image/*" ngf-max-size="2MB" ngf-model-invalid="errorFile" /></div>
13 <div><button class="btn btn-info" ng-click="addProduct()"></div>
14 </div>

 

這個是最簡單的使用主要是uploader這個屬性,其餘的accept、ngf-max-size、ngf-model-invalid都是一些限制圖片的屬性tomcat

Js

 1 myapp.controller('addProduct',['$scope','$http','FileUploader',function($scope,$http,FileUploader){
 2          
 3 //在外圍定義一個數組,賦值給formData,經過改變此數組,實現數據的改變
 4          var productInfo=[];
 5          var uploader = $scope.uploader = new FileUploader({
 6             url: 'add',
 7             formData:productInfo
 8         });
 9           uploader.onSuccessItem = function(fileItem, response, status,  headers) {             
10                  alert(response);   
11          };
12            $scope.addProduct = function() {
13             uploader.uploadAll();
14             
15         }
16 }])

 

java

 1     @RequestMapping(value="add",method = RequestMethod.POST)
 2     public ResponseEntity<Object> addProduct(@RequestParam("file") MultipartFile uploadFiles,ProductVo productVo){
 3 
 4         String fileName=uploadFile.getOriginalFilename();
 5         String prefix="."+fileName.substring(fileName.lastIndexOf(".")+1);
 6         File dst=null;
 7         try {
 8             String root = System.getProperty("catalina.base");    //獲取tomcat根路徑
 9             File uploadDir = new File(root, "webapps/upload");    //建立一個指向tomcat/webapps/upload目錄的對象
10             if (!uploadDir.exists()) {
11                 uploadDir.mkdir();                                //若是不存在則建立upload目錄
12             }
13             dst = new File(uploadDir, 
14                     UUID.randomUUID().toString()+prefix);                //建立一個指向upload目錄下的文件對象,文件名隨機生成    
15             uploadFile.transferTo(dst);                            //建立文件並將上傳文件複製過去
16         } catch (Exception e) {
17             e.printStackTrace();
18         }
19       //而後把路徑set到productVo中 完成添加 "/upload/"+dst.getName();
20 
21 }

如此就完成了。服務器

 

主要問題

在Js中給formData賦值 由於formData的new生成的因此 就是固定不變的,若是直接寫formData:[$scope.prodctInfo],就會致使formData沒有值,後臺就獲取不到其餘數據了。app

若是失敗的話能夠調用onBeforeUploadItem function(item)這個方法,給formData從新賦值,達到修改的目的。以下:dom

uploader.onBeforeUploadItem function(item){
   formData:「最終須要傳遞的值」
}
相關文章
相關標籤/搜索