Atualmente, tenho um formulário HTML em que os usuários preenchem os detalhes de um anúncio que desejam publicar. Agora, desejo poder adicionar um dropzone para fazer upload de imagens do item à venda.
Eu encontrei o Dropzone.js que parece fazer a maior parte do que eu preciso. No entanto, ao examinar a documentação, parece que você precisa especificar a classe de todo o formulário como dropzone
(em vez de apenas o elemento de entrada ). Isso significa que todo o meu formulário se torna o dropzone .
É possível usar o dropzone em apenas parte do meu formulário, ou seja, especificando apenas o elemento como classe "dropzone" , em vez de todo o formulário?
Eu poderia usar formulários separados, mas quero que o usuário possa enviar tudo com um botão.
Como alternativa, existe outra biblioteca que pode fazer isso?
Muito Obrigado
fonte
Eu tive exatamente o mesmo problema e descobri que a resposta de Varan Sinayee foi a única que realmente resolveu a pergunta original. Essa resposta pode ser simplificada, então aqui está uma versão mais simples.
Os passos são:
Crie um formulário normal (não esqueça o método e enctype args, pois isso não é mais tratado pelo dropzone).
Coloque uma div dentro com o
class="dropzone"
(é assim que o Dropzone se liga a ele) eid="yourDropzoneName"
(usado para alterar as opções).Defina as opções do Dropzone, para definir o URL onde o formulário e os arquivos serão publicados, desative o autoProcessQueue (para que isso aconteça apenas quando o usuário pressionar 'enviar') e permita vários uploads (se necessário).
Defina a função init para usar o Dropzone em vez do comportamento padrão quando o botão Enviar for clicado.
Ainda na função init, use o manipulador de eventos "sendmultiple" para enviar os dados do formulário junto com os arquivos.
Voilà! Agora você pode recuperar os dados como faria com um formulário normal, em $ _POST e $ _FILES (no exemplo, isso aconteceria em upload.php)
HTML
JS
fonte
processQueue()
chamada? Eu tento usarsubmit()
ouclick()
, ambos não funcionam.$(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); });
(desculpe, eu não sei como colocar quebras de linha aqui)O "dropzone.js" é a biblioteca mais comum para o upload de imagens. Se você deseja que o "dropzone.js" seja apenas parte do seu formulário, execute as seguintes etapas:
1) para o lado do cliente:
HTML:
JQuery:
2) para o lado do servidor:
ASP.Net MVC
fonte
O tutorial do Enyo é excelente.
Descobri que o script de exemplo no tutorial funcionava bem para um botão incorporado no dropzone (ou seja, o elemento do formulário). Se você deseja ter o botão fora do elemento do formulário, consegui fazê-lo usando um evento click:
Primeiro, o HTML:
Em seguida, a tag de script ....
fonte
Além do que o sqram estava dizendo, o Dropzone possui uma opção adicional não documentada, "hiddenInputContainer". Tudo o que você precisa fazer é definir essa opção para o seletor do formulário ao qual você deseja que o campo do arquivo oculto seja anexado. E pronto! O campo do arquivo ".dz-hidden-input" que o Dropzone normalmente adiciona ao corpo se move magicamente para o seu formulário. Não é possível alterar o código-fonte do Dropzone.
Agora, enquanto isso funciona para mover o campo do arquivo Dropzone para o seu formulário, o campo não tem nome. Então você precisará adicionar:
para dropzone.js após esta linha:
em torno da linha 547.
fonte
Eu tenho uma solução mais automatizada para isso.
HTML:
JavaScript:
Laravel:
Não há necessidade de desativar o DropZone Discovery e o envio normal do formulário poderá enviar o arquivo com outros campos através da serialização padrão.
Esse mecanismo armazena o conteúdo do arquivo como string base64 no campo de entrada oculto quando é processado. Você pode decodificá-lo de volta à string binária no PHP através do
base64_decode()
método padrão .Não sei se esse método será comprometido com arquivos grandes, mas funciona com ~ 40 MB.
fonte
Você pode modificar os dados do formulário capturando o evento 'send' no seu dropzone.
fonte
Para enviar todos os arquivos juntamente com outros dados do formulário em uma única solicitação, você pode copiar os
input
nós ocultos temporários do Dropzone.js no seu formulário. Você pode fazer isso noaddedfiles
manipulador de eventos:Obviamente, essa é uma solução alternativa dependente dos detalhes da implementação. Código fonte relacionado .
fonte
myDropzone.on("thumbnail", () => {})
evento. A execução do processamento imediatamente no"addedFile"
arquivo ainda pode estarundefined
após o acesso.files[]
mas ficam em branco, não importa o que eu faça. Alguma ideia? Fazê-lo no Laravel, se faz alguma diferença.Quero contribuir com uma resposta aqui, pois também enfrentei o mesmo problema - queremos que o elemento $ _FILES esteja disponível como parte da mesma postagem em outro formulário. Minha resposta é baseada em @mrtnmgs, no entanto, observa os comentários adicionados a essa pergunta.
Em primeiro lugar: o Dropzone publica seus dados via ajax
Só porque você usa a
formData.append
opção ainda significa que você deve enfrentar as ações de UX - isto é, tudo acontece nos bastidores e não é um post de formulário típico. Os dados são lançados no seuurl
parâmetro.Segundo: se você deseja imitar uma postagem de formulário, será necessário armazenar os dados postados
Isso requer que o código do servidor armazene sua
$_POST
ou$_FILES
em uma sessão disponível para o usuário em outro carregamento de página, pois o usuário não irá para a página em que os dados publicados são recebidos.Terceiro: você precisa redirecionar o usuário para a página em que esses dados são acionados
Agora que você publicou seus dados, os armazenou em uma sessão, é necessário exibi-los / ação para o usuário em uma página adicional. Você precisa enviar o usuário para essa página também.
Então, para o meu exemplo:
[Código do Dropzone: usa o Jquery]
fonte
Este é apenas outro exemplo de como você pode usar o Dropzone.js em um formulário existente.
dropzone.js:
Então, mais tarde no arquivo eu coloquei
Isso pressupõe que você tenha uma div com o ID
#botofform
dessa maneira. Ao fazer o upload, você pode usar os nomes dos arquivos enviados.Nota: meu script de upload retornou oenuploadedfilename.jpeg dubblenote, você também precisaria criar um script de limpeza que verifique o diretório de upload em busca de arquivos não utilizados e os exclua ..se em um formulário não autenticado de front-end :)
fonte
Aqui está o meu exemplo, é baseado no Django + Dropzone. A exibição selecionou (obrigatório) e enviou.
fonte