2016-04-07 9 views
0

Ich versuche, ng-Datei-Upload und Multiparty zum Hochladen von Dateien zu verwenden, aber ich habe ständig eine files.file undefined Fehler, ich ist dieses Problem nicht sicher durch ng-Datei-Upload oder das Mehr verursacht wird, verbringe ich fast 20 Stunden auf diesem .....Versuchen, Datei mit ng-Datei-Upload und Multiparty zum Hochladen von Dateien hochladen

Hier ist mein Code users.client.view.html

<div class="modal-footer"> 
    <div class="btn-group"> 
     <label title="Upload" for="fileInput" class="btn btn-primary"> 
     <input type="file" accept="image/*" id="fileInput" class="hide"> 
     Upload new image 
     </label> 
    </div> 
    <button ng-click="uploadAvatar(croppedAvatarImage)" type="button" class="btn btn-primary">Save changes</button> 
</div> 

benutzer.client.controller.js

$scope.uploadAvatar = function(image) { 
    $scope.uploadInProgress = true; 

    $scope.uploadProgress = 0; 
     if (angular.isArray(image)) { 
      image = image[0]; 
     } 
     Upload.upload({ 
      url: '/api/v1/user/me/avatar', 
      headers: { 
       'Content-Type': 'multipart/form-data' 
      }, 
      method: 'POST', 
      data: { 
       file: image 
      } 
     }).success(function(data, status, headers, config) { 
      console.log("upload success!"); 
      $scope.$apply(); 
     }).error(function(err) { 
      $scope.uploadInProgress = false; 
      console.log("upload failed!"); 
    }); 
}; 

users.profile.server.controller.js

exports.uploadAvatar = function(req, res) { 
    var form = new multiparty.Form(); 
    form.parse(req, function(err, fields, files) { 

     Object.keys(files).forEach(function(name) { 
      console.log('got file named ' + name); 
     }); 

     console.log(files, files.file); 

     var file = files.file[0]; // HERE THE PROGRAM CRASHED BY THE ERROR "Cannot read property '0' of undefined" 
     var contentType = file.headers['content-type']; 
     var extension = file.path.substring(file.path.lastIndexOf('.')); 
     var destPath = '/' + user.id + '/profile' + '/' + uuid.v4() + extension; 

     var headers = { 
      'x-amz-acl': 'public-read', 
      'Content-Length': file.size, 
      'Content-Type': contentType 
     }; 
     var uploader = s3Client.upload(file.path, destPath, headers); 

     uploader.on('error', function(err) { 
      res.status(500).send(err); 
      //TODO handle this 
     }); 

     uploader.on('end', function(url) { 
      //TODO do something with the url 
      console.log('file opened:', url); 
     }); 
    }); 
}; 

Antwort

0

Ok ich fina Ich habe das herausgefunden, ich versuche tatsächlich, ein Base64 als Datei hochzuladen, weil das img, das ich bekomme, von ngCrop stammt, was eine Base64-Zeichenfolge ist, so dass es definitiv nicht in Datei Feld gefunden werden kann.

1

Dateien ist ein Objekt, in dem die Eigenschaftsnamen Feldnamen sind und die Werte sind Arrays von Dateiobjekten. Also versuchst du, Namen zu Feld hinzuzufügen und es zu verwenden, um Dateiarray zu erhalten.

In users.client.view.html, name-Attribut hinzufügen:

<input type="file" accept="image/*" id="fileInput" name="fileInput" class="hide"> 

In users.profile.server.controller.js:

ändern Code unten

var file = files.file[0]; 

zu

var file = files.fileInput[0]; 
+0

Vielen Dank für Ihren Hinweis! Aber das Problem ist, ich versuchte ** console.log (Dateien) ** und die Ausgabe ist {}, was bedeutet, nichts in das Backend hochladen, aber ich kann wirklich nicht herausfinden, welcher Teil ist der Punkt – C0deZ

+0

Ich kann nur Felder definiert , aber die req.files ist immer leer – C0deZ