Quero fazer uma postagem simples de formulário com várias partes do AngularJS para um servidor node.js.O formulário deve conter um objeto JSON em uma parte e uma imagem na outra parte (atualmente, estou postando apenas o objeto JSON com $ resource)
Achei que deveria começar com input type = "file", mas depois descobri que o AngularJS não pode vincular a isso ..
todos os exemplos que posso encontrar são para agrupar plugins jQuery para arrastar e soltar. Quero um upload simples de um arquivo.
Eu sou novo no AngularJS e não me sinto à vontade em escrever minhas próprias diretivas.
angularjs
angularjs-fileupload
Gal Ben-Haim
fonte
fonte
Respostas:
Uma solução real de trabalho sem outras dependências além do angularjs (testado com a v.1.0.6)
html
O Angularjs (1.0.6) não suporta ng-model em tags "input-file", então você deve fazê-lo de uma "maneira nativa" que passe todos os arquivos selecionados (eventualmente) do usuário.
controlador
A parte interessante é o tipo de conteúdo indefinido e o transformRequest: angular.identity que permite ao $ http a capacidade de escolher o "tipo de conteúdo" certo e gerenciar o limite necessário ao manipular dados de várias partes.
fonte
fd.append("file", files[0]); fd.append("file",files[1]); fd.append("name", "MyName")
Você pode usar a diretiva ng / upload de arquivos ng simples / leve . Ele suporta arrastar e soltar, progresso de arquivos e upload de arquivos para navegadores não HTML5 com calço FileAPI flash
JS:
fonte
É mais eficiente enviar um arquivo diretamente.
A codificação base64 de
Content-Type: multipart/form-data
adiciona uma sobrecarga extra de 33%. Se o servidor suportar, é mais eficiente enviar os arquivos diretamente:Ao enviar um POST com um objeto File , é importante definir
'Content-Type': undefined
. O método de envio XHR detectará o objeto File e definirá automaticamente o tipo de conteúdo.Para enviar vários arquivos, consulte Fazendo várias solicitações diretamente de uma lista de arquivos
$http.post
O
<input type=file>
elemento não funciona por padrão com a diretiva ng-model . Ele precisa de uma diretiva personalizada :Demonstração de trabalho da diretiva "select-ng-files" que funciona com
ng-model
1$http.post
com tipo de conteúdomultipart/form-data
Se for necessário enviar
multipart/form-data
:Ao enviar um POST com a API FormData , é importante definir
'Content-Type': undefined
. O método de envio XHR detectará oFormData
objeto e definirá automaticamente o cabeçalho do tipo de conteúdo como multipart / form-data com o limite apropriado .fonte
filesInput
diretiva não parece estar funcionando com o Angular 1.6.7, posso ver os arquivos nong-repeat
mas o mesmo$scope.variable
está em branco no controlador? Também um de seus exemplos usafile-model
e umfiles-input
select-ng-files
. Testado com AngularJS 1.7.2.Eu apenas tive esse problema. Portanto, existem algumas abordagens. A primeira é que novos navegadores suportam o
Siga este link para um blog com informações sobre como o suporte é limitado aos navegadores modernos, mas, caso contrário, ele resolve totalmente esse problema.
Caso contrário, você pode postar o formulário em um iframe usando o atributo target. Ao publicar o formulário, defina o destino como um iframe com a propriedade de exibição definida como none. O destino é o nome do iframe. (Só para você saber.)
Eu espero que isso ajude
fonte
Sei que é uma entrada tardia, mas criei uma diretiva de upload simples. Que você pode começar a trabalhar rapidamente!
ng-simple-upload mais no Github com um exemplo usando a API da Web.
fonte
Você pode fazer o upload via
$resource
atribuindo dados ao atributo params do recurso da seguinteactions
forma:fonte
Acabei de escrever uma diretiva simples (a partir de uma existente) para um upload simples no AngularJs.
(O plugin exato do uploader do jQuery é https://github.com/blueimp/jQuery-File-Upload )
Um Uploader Simples usando AngularJs (com Implementação CORS)
(Embora o lado do servidor seja para PHP, você pode simplesmente mudar o nó também)
fonte