Сбой при загрузке файлов, когда имя файла содержит пробел

#php #angularjs #slim #ng-file-upload

#php #angularjs #тонкий #ng-file-upload

Вопрос:

Я погуглил этот вопрос, но не нашел ответа. Я использую угловую директиву ng-file-upload для загрузки изображений в свой сервер. В фоновом режиме я использую php для извлечения изображения. Все работает нормально, если я выбираю изображение, которое не содержит пробелов. Но если я выбираю изображение, содержащее пробелы, оно выдает ошибку. Это то, что я сделал

  //app.js
                       Upload.upload({  
                         url: "api/index.php/postNewFeedsWithPicture",
                                file: $scope.file,
                                method: "post"
                                 }).then(function (response) {
                                $scope.isShowing = false;
                                if (response.data.error) {
                                    toastr.options = {positionClass: 'toast-bottom-full-width'};
                                    toastr.error(response.data.message, {timeOut: 5000});
                                }
                                else {
                                    toastr.options = {positionClass: 'toast-bottom-full-width'};
                                    toastr.success(response.data.message, {timeOut: 5000});
                                    $scope.file = null;

                                }

                            }, function (reason) {
                                $scope.isShowing = false;
                                toastr.options = {positionClass: 'toast-bottom-full-width'};
                                toastr.error('Message not posted! Network error', {timeOut: 5000});
                            });                         
  

в моем html-файле я сделал это

  <div role="button" ngf-select ng-model="file" name="file" ngf-pattern="'image/*'" ngf-accept="'image/*'" ngf-max-size="20MB">Upload</div>
  

в моем php-файле я написал функцию, которая сохраняет изображение

 function savePictureToDb($fileName, $dirName) {
$target_dir = "../image/" . $dirName . "/";
$target_file = $target_dir . basename($_FILES[$fileName]["name"]);
$uploadOk = 1;
$errorMsg = null;
$report = array();
$imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
// Check file size. //20mb
if ($_FILES[$fileName]["size"] > 20000000) {
    $uploadOk = 0;
    $errorMsg = "File size is greater than 20 mega bytes";
}
// Allow certain file formats
if ($imageFileType != "jpg" amp;amp; $imageFileType != "png" amp;amp; $imageFileType != "jpeg" amp;amp; $imageFileType != "gif") {
    $uploadOk = 0;
    $errorMsg = "The file selected is not an image";
}
if ($uploadOk == 0) {
    $report[ERROR] = TRUE;
    $report[MESSAGE] = $errorMsg;
    return $report;
    // if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES[$fileName]["tmp_name"], $target_file)) {
        rename($target_file, $target_dir . generateRandStr_md5(500) . "." . $imageFileType);
        $response['path'] = basename($_FILES[$fileName]["name"]);
        $report[ERROR] = FALSE;
        $report[PATH] = $response['path'];
        return $report;
    } else {
        $errorMsg = "Unexpected error";
        $report[ERROR] = TRUE;
        $report[MESSAGE] = $errorMsg;
        return $report;
    }
}
  

}

Это работает нормально, но если изображение содержит пробелы, это ошибка, которую я получаю при отладке

  array (
  'file' => 
   array (
   'name' => 'Age Declaration.jpg',
   'type' => '',
   'tmp_name' => '',
   'error' => 1,
    'size' => 0,
  ),
 )
  

Комментарии:

1. вы можете использовать $target_file = $target_dir . (строка)базовое имя ($_FILES[$fileName][«имя»]);

Ответ №1:

Переименуйте имя файла со случайным значением

 $filename1=explode(".", $file);
$extension=end($filename1);
$file=rand().time().".".$extension;
  

Или используйте pathinfo() для расширения

 $ext = pathinfo($filename, PATHINFO_EXTENSION);