2015-11-05 2 views
10

Я рассмотрел вопросы и ответы по этой теме, и я не думаю, что они в полной мере ответить на мои вопросы, которые:загрузки файлов Использование AngularJS с PHP сервера сценария

  • загрузка, используя угловой фронтэнда (в зависимости от того, как эта обрабатывается) отправляет данные файла сценарию на сервере, например, скрипту php (который является моим предпочтительным методом). После запуска PHP-скрипта я хочу вернуться на страницу, с которой была сделана загрузка, и дать там сообщение. Я не хочу, чтобы страница php отображалась. По достоинству оценят некоторые рекомендации о том, как достичь этого. В идеале, какой код добавить к скрипту php.

  • Я хочу захватить и сохранить информацию о базе данных, относящуюся к файлу, такую ​​как имя и данные, введенные/выбранные пользователем, такие как категория документа. Есть ли способ достичь этого как часть загрузки файла? т.е. в идеале пользователь будет заполнять записи в форме, которая включает в себя кнопку загрузки файла, чтобы пользователь выбирал файл для загрузки, но только на клике формы, которую вы нажали, - это загрузка файла, выполняемая вместе с другими данными формы, возвращаемыми для обработки.

Я потратил 3 дня на это .. так что любая помощь будет большой.

+0

Вы пробовали что-то вроде нг потока? Он включает пример углового и php-кода. – Tristan

+0

спасибо за это. Это выглядит великолепно, но (а) я не могу заставить его работать (проходит через движения без видимых ошибок, но файл на самом деле не загружается .. используя их основной пример .. в списке переходов показана передача файла завершена как истина (но файл на самом деле не загружается) и загрузка как ложная), и (б) мне нужно разобраться, как отправлять другие поля данных одновременно или как часть четкого рабочего потока, например, после загрузки файла, имя файла cld должно быть введено файлом загрузите в поле формы, а пользователь оставит для ввода других полей формы, а затем опубликуйте запись REST для базы данных. –

+0

Ответ, предоставленный Midhun, является всеобъемлющим и является хорошим вариантом. Если вы хотите пойти с ng-flow, я могу дать вам подробную информацию о том, как включить данные формы в сообщение? – Tristan

ответ

24

Вы можете использовать объекты FormData для отправки данных формы на ваш сервер. Это позволит вам одновременно отправлять как файлы, так и текстовые данные. Вы можете найти дополнительную информацию об этом here.

index.html

<body ng-controller="myCtrl"> 
    <div class="file-upload"> 
     <input type="text" ng-model="name"> 
     <input type="file" file-model="myFile"/> 
     <button ng-click="uploadFile()">upload me</button> 
    </div> 
</body> 


В app.js, мы создаем пользовательскую директиву fileModel, в котором мы слушаем изменения в содержание входного элемента и изменить значение переменной в соответственно. Это достигается с помощью службы $ parse для установки значения в нашей области.

app.js

var myApp = angular.module('myApp', []); 

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

// We can write our own fileUpload service to reuse it in the controller 
myApp.service('fileUpload', ['$http', function ($http) { 
    this.uploadFileToUrl = function(file, uploadUrl, name){ 
     var fd = new FormData(); 
     fd.append('file', file); 
     fd.append('name', name); 
     $http.post(uploadUrl, fd, { 
      transformRequest: angular.identity, 
      headers: {'Content-Type': undefined,'Process-Data': false} 
     }) 
     .success(function(){ 
      console.log("Success"); 
     }) 
     .error(function(){ 
      console.log("Success"); 
     }); 
    } 
}]); 

myApp.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){ 

    $scope.uploadFile = function(){ 
     var file = $scope.myFile; 
     console.log('file is '); 
     console.dir(file); 

     var uploadUrl = "save_form.php"; 
     var text = $scope.name; 
     fileUpload.uploadFileToUrl(file, uploadUrl, text); 
    }; 

}]); 

save_form.php

<?php 

    $target_dir = "./upload/"; 
    $name = $_POST['name']; 
    print_r($_FILES); 
    $target_file = $target_dir . basename($_FILES["file"]["name"]); 

    move_uploaded_file($_FILES["file"]["tmp_name"], $target_file); 

    //write code for saving to database 
    include_once "config.php"; 

    // Create connection 
    $conn = new mysqli($servername, $username, $password, $dbname); 
    // Check connection 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 

    $sql = "INSERT INTO MyData (name,filename) VALUES ('".$name."','".basename($_FILES["file"]["name"])."')"; 

    if ($conn->query($sql) === TRUE) { 
     echo json_encode($_FILES["file"]); // new file uploaded 
    } else { 
     echo "Error: " . $sql . "<br>" . $conn->error; 
    } 

    $conn->close(); 

?> 


+0

Большое спасибо Midhum. Пройдет это завтра. Был в больнице сегодня! –

+0

Однако я использую ng-file-upload, и я попробовал Midhum и примеры с страницы github, я получаю следующую ошибку: Недействительный маркер со смещением 623, найдено: 250 Это, похоже, происходит перед функцией Upload называется .. У меня есть консоль.log немедленно в функции загрузки, которая не называется Любая идея? –

+0

Я отредактировал ответ. Этот метод лучше и не требует внешних библиотек. Попробуйте. –

Смежные вопросы