I'm using **AngularJS v1.6.1,** **Apache 2.4.10** on Debian with **PHP 5.6.24** and I'm trying to upload a file to my server using `$http` POST service.
On my `php.ini`, max file size is set to 8Mo, max post size too, upload file is on, and memory size limit is set to 128Mo.

**Form:**

```
<input type="file" accept="application/pdf" id="uploadOT" max-files="1" ng-model="uploadOT" name="uploadOT" valid-file required ng-class="{'md-input-invalid':uploadForm.uploadOT.$error.validFile}" />

```

**Angular directive:** (when input content change, get a FileReader object and send file)

```
myModule.directive('validFile', function() {
    return {
        require:    'ngModel',
        link:       function(scope, elt, attrs, ctrl) {
            ctrl.$setValidity('validFile', elt.val() !== '');
            elt.bind('change', function() {

                var file = document.getElementById('uploadOT').files;
                var reader = new FileReader();
                reader.onload = function(e) {
                    scope.sendFile(reader, scope.id);
                };
                scope.showUploadProgress = true;
                scope.filename = file[0].name;
                reader.readAsBinaryString(file[0]);

                ctrl.$setValidity('validFile', elt.val() !== '');
                scope.$apply(function() {
                    ctrl.$setViewValue(elt.val());
                    ctrl.$render();
                });
            });
        }
    };
});

```

**Inside controller:**

```
$scope.sendFile = function(reader, id) {
    var fd = new FormData();
    fd.append('id', id);
    fd.append('file', reader.result);
    fd.append('MAX_FILE_SIZE', 8 * 1024 * 1024);
    $http.post('api/upload.php', fd, {
        headers:            {'Content-Type' : undefined },
        transformRequest:   angular.identity
    }).then(function() {
        alert('upload success');
    }, function() {
        $scope.showUploadError = true;
        $scope.showUploadProgress = false;
        $scope.postError = 'Une erreur inconnue est survenue !';
    });
};

```

On server side (file `api/upload.php`), I print variables `$_POST` and `$_FILES` with `print_r()`.

**Why is `$_FILES` always empty, and my file data is in `$_POST['file']`?**

I can create file from `$_POST['file']` data with php function *`file_put_contents()`* but I cannot make verifications that I can make with *`$_FILES`*. Is it really important (security issues)?

If I change my POST `Content-Type` to `multipart/form-data`, the same thing happend.