Usando a entrada de formulário para acessar a câmera e fazer upload de fotos imediatamente usando o aplicativo da web

88

Eu encontrei esta resposta que é brilhante:

No iPhone iOS6 e do Android ICS em diante, HTML5 tem a seguinte tag que permite que você tire fotos do seu dispositivo:

    <input type="file" accept="image/*" capture="camera">

A captura pode assumir valores como câmera, filmadora e áudio.

É possível dar um passo adiante usando algum tipo de ajax para fazer o upload imediato da foto depois de tirada?

Por exemplo, usando meu telefone, uma vez que toco na entrada, ele abre a câmera que me permitirá imediatamente tirar uma foto e salvá-la. Quando eu salvo na câmera, ele é listado pelo botão de entrada como o arquivo a ser carregado.

O que seria necessário para que essa foto fosse carregada imediatamente, em vez de esperar que o usuário clique no botão Enviar do formulário?

micah
fonte
1
O que você já experimentou? O que você atrapalhou?
Marcin
Se você estiver interessado em controles de terceiros, pode considerar Kendo UI demos.kendoui.com/web/upload/api.html
HaBo
1
@Marcin Nunca fui forte com javascript, então não tinha certeza do que tentar. O que estou tentando replicar é o recurso de aplicativo nativo em que a foto é enviada imediatamente para o serviço ou servidor remoto sem nenhuma etapa extra após tirar a foto com a câmera.
micah

Respostas:

103

É realmente fácil fazer isso, basta enviar o arquivo por meio de uma solicitação XHR dentro do manipulador onchange de entrada do arquivo.

<input id="myFileInput" type="file" accept="image/*;capture=camera">

var myInput = document.getElementById('myFileInput');

function sendPic() {
    var file = myInput.files[0];

    // Send file here either by adding it to a `FormData` object 
    // and sending that via XHR, or by simply passing the file into 
    // the `send` method of an XHR instance.
}

myInput.addEventListener('change', sendPic, false);
Ray Nicholus
fonte
1
Obrigado por esta resposta. Portanto, este ouvinte de evento está observando a entrada # myFileInput para uma alteração, sabendo quando uma foto está na fila para ser carregada? E então suponho que ele executará a função sendPic com o objeto FormData fazendo o upload automático da foto? Eu entendo o que é XHR em um nível muito alto. Eu entendi direito?
micah
O ouvinte de evento é chamado depois que o usuário seleciona um arquivo.
Ray Nicholus
Então, o ouvinte de eventos solicita que o sendPic()upload do arquivo imediatamente após a câmera tirar a foto?
micah
1
Você pode me indicar a direção certa para saber como enviar um formulário via XHR?
iluvpinkerton
3
@iluvpinkerton Claro, use (ou dê uma olhada em) Fine Uploader ou ajax-form . Isenção de responsabilidade - eu sou o desenvolvedor de ambas as bibliotecas.
Ray Nicholus