6

我已经尝试了好几天了。假设我有如下表格:

    <form ng-submit="create()" class="form-horizontal" enctype="multipart/form-data">
      <div class="control-group">
        <label class="control-label">name : </label>
        <div class="controls">
          <input type="text" class="input-xlarge" ng-model="message.title" />
        </div>
      </div>
      <div class="control-group">
        <label class="control-label">avatar : </label>
        <div class="controls">
          <input type="file" ng-model="message.avatar" name="message[avatar]" />
        </div>
      </div>
      <div class="well">
        <input class="btn btn-large btn-primary" type="submit" value="建立資料" />
      </div>
    </form>

我正在使用carrierwave gem 来处理幕后的文件上传。我的控制器是这样的:

 $scope.create = function($scope.message){
   var deferred = $q.defer();
   $http({
       method: 'POST',
       url: '/resources/messages',
       data: $.param({message: message}),
       headers: {'Content-Type': 'multipart/form-data'}
   }).
     success(function(data, status, headers, config){
       deferred.resolve(data);
     }).
     error(function(data, status, headers, config){
       deferred.reject(status);
     });
   return deferred.promise;
  };

但是它不起作用。我打算做的是创建一个表单并像旧方式一样上传所有内容,但是我发现的示例,例如 ng-upload 或 like this postjquery file upload,它们不适合我的需要。是否有任何示例或示例代码用于此目的?谢谢你。

4

1 回答 1

5

我认为“像旧方法一样”是不使用 Ajax,但我猜这不是你的意思。:)

@shaunhusain 的小提琴是如何使用FormData 对象处理文件上传的一个很好的例子。并且使用这个站点作为参考,您可以使用transformRequest来合并 FormData 对象。

保留您的基本$http代码,修改它以添加转换对象:

$scope.create = function(message){
var deferred = $q.defer();
$http({
   method: 'POST',
   url: '/resources/messages',
   data: message // your original form data,
   transformRequest: formDataObject  // this sends your data to the formDataObject provider that we are defining below.
   headers: {'Content-Type': 'multipart/form-data'}
}).
 success(function(data, status, headers, config){
   deferred.resolve(data);
 }).
 error(function(data, status, headers, config){
   deferred.reject(status);
 });
return deferred.promise;
};

创建一个工厂,将操作表单数据合并到可发送的有效负载中。它将遍历您的表单数据(包括上传的文件)并返回一个对发件人友好的对象:

app.factory('formDataObject', function() {
    return function(data) {
        var fd = new FormData();
        angular.forEach(data, function(value, key) {
            fd.append(key, value);
        });
        return fd;
    };
});

我没有对此进行测试,但它应该可以开箱即用。

于 2013-07-14T18:32:18.060 回答