无法上传文件,php和angularjs

时间:2014-11-21 13:33:40

标签: javascript php angularjs

我尝试使用angularJs和PHP上传文件。

我正在使用angular-file-upload,https://github.com/danialfarid/angular-file-upload

问题似乎出现在我的PHP代码中,因为它希望将文件移动到目标目录。

这是我的角色:

$ scope.onFileSelect = function($ files){     // Vi har valt en eller跳蚤过滤器     // $filesärenarrayinnehållandedevalda filerna att ladda upp。 Dess namn,storlek och typ

for(var i = 0; i < $files.length; i++)
{
    var file = $files[i];
    $scope.upload = $upload.upload({
        url: 'lib/actions.php',
        data: {myObj: $scope.myModelObj},
        file: file

    }).progress(function(evt) {
        console.log('percent: ' + parseInt(100.0 * evt.loaded / evt.total));
    }).success(function(data, status, headers, config) {
        console.log(data);
    });
}

};

这很有效。对我的PHP文件进行了POST:

if(isset($_FILES['file']))
{
    $target_dir = "books/";
    $target_file = $target_dir . basename($_FILES["file"]["name"]);

    if(move_uploaded_file($_FILES['file']['tmp_name'], $target_file))
    {
        echo "YES";
    }
    else
    {
        echo "wrong";
    }
}   

这总是打印“错误”。我不明白为什么。谁可以帮助我?

1 个答案:

答案 0 :(得分:0)

尝试使用多部分POST类型而不是$ _FILES,这是发布文件的优雅方式:http://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs。这对我有用。

修改

更好的是,如果链接网站出现问题,我会在这里写下优雅的方式。

您需要创建一个附加到控制器的指令,这样您就可以处理当前作用域,该指令可能如下所示:

.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]);
            });
        });
    }
};

}]);

创建指令后,您可以在html部分中使用,如下所示:

<input type="file" file-model="myFile"/>

好的,现在我们有自己的指令可以处理你的文件,我们需要发送到服务器(在你的情况下是localhost)。所以我们为此提供服务:

.service('fileUpload', ['$http', function ($http) {
this.uploadFileToUrl = function(file, uploadUrl){
    var fd = new FormData();
    fd.append('file', file);
    $http.post(uploadUrl, fd, {
        transformRequest: angular.identity,
        headers: {'Content-Type': undefined}
    })
    .success(function(){
    })
    .error(function(){
    });
}

}]);

就像那样,您可以为此服务提供任何网址,而不仅仅是您的本地主机,以及文件,您要上传的内容。

但我们是怎么做到的?只需将其复制到您的控制器:

var file = $scope.myFile;
var uploadUrl = 'http://www.example.com/images';
fileUpload.uploadFileToUrl(file, uploadUrl);

这应该有效。 :)