2014-10-17 5 views
8

Il seguente codice per il caricamento delle texture funzionava in angularjs 1.2.26 ma ha smesso di funzionare quando ho aggiornato la mia applicazione web alla 1.3.0.'Token inaspettato' in caricamento AJAX di multipart/form-data in angular.js 1.3.0

codice HTML

<input file-model="file" name="file" type="file"> 

direttiva fileModel

app.directive('fileModel', [ '$parse', function($parse) { 
    return { 
     restrict : 'A', 
     link : function(scope, element, attrs) { 
      var model = $parse(attrs.fileModel); 
      var modelSetter = model.assign; 

      element.bind('change', function() { 
       scope.$apply(function() { 
        modelSetter(scope, element[0].files[0]); 
       }); 
      }); 

      scope.$on("reset", function() { 
       element.val(null); 
      }); 

     } 
    }; 
} ]); 

Upload Funzione - In 1.2.26 scegliendo "multipart/form-data", come Content-Type non avrebbe funzionato. Ma con "indefinito" come angolare Content-Type farebbe un qualche tipo di magia che lo farebbe funzionare.

var upload = function(textureUploadUrl) { 
     var formData = new FormData(); 
     formData.append('name', $scope.name); 
     formData.append('file', $scope.file); 

     $http.post(textureUploadUrl, formData, { 
      transformRequest : angular.identity, 
      headers : { 
       'Content-Type' : undefined 
      } 
     }).success(function(uploadedTexture) { 
      console.log(uploadedTexture); 

      // further processing of uploadedTexture 
     }); 
} 

ERRORE:

SyntaxError: Unexpected token h 
    at Object.parse (native) 
    at fromJson (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:1104:14) 
    at defaultHttpResponseTransform (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:8572:18) 
    at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:8517:12 
    at forEach (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:335:20) 
    at transformData (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:8516:3) 
    at transformResponse (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:9224:23) 
    at processQueue (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:12914:27) 
    at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:12930:27 
    at Scope.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js:14123:28) 

Qualcuno sa come ottenere questo lavoro nella nuova versione?

UPDATE

Ho ridotto il problema un po '. Non funziona con 1.3.0-rc.5, ma con la versione precedente (rc.4) funziona. Quindi, attualmente sto cercando di capire quali cambiamenti portano al mio problema. Ecco lo changelog.

risposta

14

Il problema era nell'intestazione della risposta della mia richiesta di caricamento della trama sul lato server. Per costruire la mia applicazione che ho usato Spring MVC e aveva una mappatura richiesta del genere, ma senza la specifica produces:

@RequestMapping(value = "/uploadUrl", method = RequestMethod.POST, produces = "text/plain; charset=utf-8") 
@ResponseBody 
public String textureUploadPOST(HttpServletRequest req) { 
    // upload texture and create serveUrl for the texture 
    return serveUrl; 
} 

Così, senza specificare text/plain come Content-Type, Primavera utilizza automaticamente application/json come Content-Type. E questo fa sì che angular.js invochi JSON.parse dalla 1.3.0-rc.5 (change). Il caricamento della mia texture restituisce un URL che indica la posizione in cui viene pubblicata l'immagine. Poiché si tratta di una stringa semplice, ha generato il messaggio di errore descritto. Quindi, non dimenticare di specificare i corretti tipi di contenuto nelle risposte del tuo server :-)

+0

+1. Ho avuto excatly lo scenario (upload di file che restituisce l'url) ma con la maglia invece di Spring MVC. La stessa soluzione funziona, annoto la mia risorsa con l'equivalente jersey: '@Produces (TEXT_PLAIN)'. Mi hai salvato un sacco di tempo. – gontard

+1

Felice di sentirlo! All'inizio pensavo che avesse a che fare con il caricamento stesso, ma si è scoperto che si trattava di un problema con la risposta. – Jonas

+0

Si noti che il problema si verifica quando si esegue l'aggiornamento da 1,2 angolare a 1,3. – gontard