Chcę zrobić prosty post w postaci wieloczęściowej z AngularJS na serwer node.js, formularz powinien zawierać obiekt JSON w jednej części i obraz w drugiej części (obecnie publikuję tylko obiekt JSON z zasobem $)
Pomyślałem, że powinienem zacząć od input type = "file", ale potem odkryłem, że AngularJS nie może się z tym powiązać.
wszystkie przykłady, które mogę znaleźć, dotyczą pakowania wtyczek jQuery do przeciągania i upuszczania. Chcę proste przesłanie jednego pliku.
Jestem nowy w AngularJS i nie czuję się komfortowo, pisząc własne dyrektywy.
angularjs
angularjs-fileupload
Gal Ben-Haim
źródło
źródło
Odpowiedzi:
Prawdziwie działające rozwiązanie bez innych zależności niż angularjs (testowane z wersją 1.0.6)
html
Angularjs (1.0.6) nie obsługuje modelu ng w tagach "pliku wejściowego", więc musisz to zrobić w "natywny sposób", który przekazuje wszystkie (ostatecznie) wybrane pliki od użytkownika.
kontroler
Fajną częścią jest niezdefiniowany typ zawartości i transformRequest: angular.identity, które dają w $ http możliwość wyboru właściwego „typu treści” i zarządzania granicami wymaganymi podczas obsługi danych wieloczęściowych.
źródło
fd.append("file", files[0]); fd.append("file",files[1]); fd.append("name", "MyName")
Możesz użyć prostej / lekkiej dyrektywy ng-file-upload . Obsługuje przeciąganie i upuszczanie, postęp plików i przesyłanie plików dla przeglądarek innych niż HTML5 z podkładką Flash FileAPI
JS:
źródło
Bardziej efektywne jest bezpośrednie wysłanie pliku.
Base64 kodowania z
Content-Type: multipart/form-data
dodaje dodatkowy 33% narzutu. Jeśli serwer to obsługuje, bardziej efektywne jest wysyłanie plików bezpośrednio:Wysyłając POST z obiektem File , ważne jest, aby ustawić
'Content-Type': undefined
. Metoda wysyłania XHR wykryje wtedy obiekt File i automatycznie ustawi typ zawartości.Aby wysłać wiele plików, zobacz Wykonywanie wielu żądań bezpośrednio z listy plików
$http.post
<input type=file>
Element nie domyślnie pracy z dyrektywą ng-modelu . Potrzebuje niestandardowej dyrektywy :Robocze demo dyrektywy „select-ng-files”, która współpracuje z
ng-model
1$http.post
z typem treścimultipart/form-data
Jeśli trzeba wysłać
multipart/form-data
:Podczas wysyłania POST z API FormData ważne jest, aby ustawić
'Content-Type': undefined
. Metoda wysyłania XHR wykryje następnieFormData
obiekt i automatycznie ustawi nagłówek typu zawartości na multipart / form-data z odpowiednią granicą .źródło
filesInput
dyrektywa nie działa z Angular 1.6.7, widzę pliki w,ng-repeat
ale to samo$scope.variable
jest puste w kontrolerze? Również jeden z twoich przykładów używafile-model
i jedenfiles-input
select-ng-files
. Testowane z AngularJS 1.7.2.Właśnie miałem ten problem. Więc jest kilka podejść. Po pierwsze, nowe przeglądarki obsługują rozszerzenie
Skorzystaj z tego linku do bloga z informacjami o tym, jak pomoc techniczna jest ograniczona do nowoczesnych przeglądarek, ale poza tym całkowicie rozwiązuje ten problem.
W przeciwnym razie możesz wysłać formularz do elementu iframe, używając atrybutu target. Podczas wysyłania formularza pamiętaj, aby ustawić cel na element iframe z właściwością wyświetlania ustawioną na none. Cel to nazwa elementu iframe. (Tak, żebyś wiedział.)
mam nadzieję, że to pomoże
źródło
Wiem, że to późny wpis, ale stworzyłem prostą dyrektywę przesyłania. Które możesz rozpocząć w mgnieniu oka!
ng-simple-upload więcej na Github z przykładem przy użyciu interfejsu API sieci Web.
źródło
Możesz przesłać za pośrednictwem
$resource
, przypisując dane do atrybutu params zasobu w następującyactions
sposób:źródło
Właśnie napisałem prostą dyrektywę (oczywiście z istniejącej) dla prostego programu do przesyłania plików w AngularJs.
(Dokładna wtyczka do przesyłania jQuery to https://github.com/blueimp/jQuery-File-Upload )
Prosty program do przesyłania korzystający z AngularJs (z implementacją CORS)
(Chociaż strona serwera jest przeznaczona dla PHP, możesz również po prostu zmienić jej węzeł)
źródło