2015-11-05 19 views
10

Sprawdziliśmy pytania i odpowiedzi na ten temat i nie sądzę, że w pełni odpowiedzieć na moje problemy, które są:przesyłać za pomocą pliku angularjs ze skryptu serwera php

  • przesyłanie za pomocą kątowego frontend (niezależnie od sposobu tego jest obsługiwane) wysyła dane pliku do skryptu na serwerze, takiego jak skrypt php (który jest moją preferowaną metodą). Po uruchomieniu skryptu php chcę powrócić na stronę, z której wysyłano pliki, i wysłać tam wiadomość. Nie chcę, żeby strona php była wyświetlana. Doceniamy pewne wskazówki, jak to osiągnąć. Idealnie jaki kod dodać do skryptu php.

  • Chcę przechwycić i zapisać w bazie danych informacje dotyczące pliku, takie jak jego nazwa i dane wprowadzone/wybrane przez użytkownika, takie jak kategoria dokumentu. Czy istnieje sposób, aby to osiągnąć w ramach przesyłania plików? tj. najlepiej, jeśli użytkownik wypełni wpisy w formularzu, które zawiera przycisk przesyłania plików, aby użytkownik wybrał plik do przesłania, ale tylko na kliknięciu formularza zostanie przesłany plik wraz z innymi danymi formularza, które zostaną zwrócone do przetworzenia.

Spędziłem 3 dni na tym .. więc każda pomoc będzie świetna.

+0

Czy próbowałeś coś podobnego ng-flow? Zawiera przykładowy kod kątowy i php. – Tristan

+0

dzięki za to. Wygląda świetnie, ale (a) nie mogę go uruchomić (wykonuje ruchy bez widocznych błędów, ale plik nie jest w rzeczywistości przesłany), co jest ich podstawowym przykładem. Lista transferów pokazuje transfer pliku zakończony jako prawdziwy (ale plik faktycznie nie przesłana) i przesyłanie jako fałszywe) i (b) muszę opracować sposób przesyłania innych pól danych w tym samym czasie lub jako część przejrzystego przepływu pracy, np. po przesłaniu pliku, nazwa pliku powinna zostać wprowadzona przez plik prześlij do pola formularza, pozostawiając użytkownika, aby wprowadzić inne pola formularza, a następnie opublikuj wpis REST dotyczący bazy danych. –

+0

Odpowiedź udzielona przez Midhun jest kompleksowa i jest dobrym rozwiązaniem. Jeśli chcesz przejść z ng-flow, mogę podać szczegółowe informacje na temat umieszczania danych formularzy w poście? – Tristan

Odpowiedz

24

Możesz użyć obiektów FormData do wysłania danych formularza na serwer. Pozwoli to na wysyłanie zarówno plików, jak i danych tekstowych w tym samym czasie. Możesz znaleźć więcej informacji na ten temat 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> 


W app.js tworzymy niestandardową fileModel dyrektywę, w której możemy słuchać do zmian w zawartości elementu wejściowego i zmienić wartość zmiennej w odpowiednio zakres. Osiąga się to za pomocą usługi $ parsowanie, aby ustawić wartość w naszym zakresie.

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

Wielkie dzięki Midhum. Przejdę przez to jutro. Był w szpitalu dzisiaj !! –

+0

Jednak korzystam z wysyłania plików w formacie Ng, a wypróbowałem Midhum i przykłady ze strony github, pojawia się następujący błąd: Nieprawidłowy znacznik w pozycji 623, znaleziony: 250 Wygląda na to, że wystąpi przed funkcją przesyłania nazywa się .. Mam konsolę.zaloguj się od razu do funkcji Upload, która nie jest nazywana Masz pomysł? –

+0

Edytowałem odpowiedź. Ta metoda jest lepsza i nie wymaga zewnętrznych bibliotek. Spróbuj. –

Powiązane problemy