JavaScript: Carregar arquivo

190

Digamos que eu tenho esse elemento na página:

<input id="image-file" type="file" />

Isso criará um botão que permite que os usuários da página da web selecionem um arquivo por meio da caixa de diálogo "Arquivo aberto ..." no navegador.

Digamos que o usuário clica no botão, seleciona um arquivo na caixa de diálogo e, em seguida, clica no botão "Ok" para fechar a caixa de diálogo.

O nome do arquivo selecionado agora está armazenado em:

document.getElementById("image-file").value

Agora, digamos que o servidor lida com POSTs com várias partes no URL "/ upload / image".

Como envio o arquivo para "/ upload / image"?

Além disso, como escuto a notificação de que o upload do arquivo terminou?

YummyBánhMì
fonte
2
O JavaScript não está manipulando os uploads, porque fica do lado do servidor. O script do lado do servidor receberá o arquivo e o moverá. Para php da pasta temporária para a pasta desejada.
22711 Bakudan
15
Votou para reabrir porque a pergunta é sobre POJS (javascript antigo simples) e não jQuery.
e2-e4 16/09

Respostas:

95

A menos que você esteja tentando fazer upload do arquivo usando ajax, basta enviar o formulário para /upload/image.

<form enctype="multipart/form-data" action="/upload/image" method="post">
    <input id="image-file" type="file" />
</form>

Se você deseja fazer upload da imagem em segundo plano (por exemplo, sem enviar o formulário inteiro), você pode usar o ajax:

Matt Ball
fonte
ou iframe tamanho 0x0 com script de upload de imagem dentro de seu src = "" e poste o formulário nele usando target = "iframeId" lendo o resultado novamente no evento iframe src .load que pode ser associado ao jQuery, por exemplo.
Dmitry
11
Atualmente, é possível fazer voto positivo via Javascript e Ajax, consulte: stackoverflow.com/a/10811427/694469 (não fiz voto negativo).
21414 KajMagnus
35
@KajMagnus, você provavelmente significava 'upload' mas acidentalmente disse 'upvote'
Samuel Allan
85

JS puro

Você pode usar buscar opcionalmente com aguardar-tentar-pegar

let photo = document.getElementById("image-file").files[0];
let formData = new FormData();

formData.append("photo", photo);
fetch('/upload/image', {method: "POST", body: formData});

Abordagem da velha escola - xhr

let photo = document.getElementById("image-file").files[0];  // file from input
let req = new XMLHttpRequest();
let formData = new FormData();

formData.append("photo", photo);                                
req.open("POST", '/upload/image');
req.send(formData);

RESUMO

  • No lado do servidor, você pode ler o nome do arquivo original (e outras informações), que é incluído automaticamente para solicitação pelo navegador no filenameparâmetro formData.
  • Você NÃO precisa definir o cabeçalho da solicitação Content-Typecomo multipart/form-data- isso será definido automaticamente pelo navegador.
  • Em vez de /upload/imagevocê pode usar o endereço completo como http://.../upload/image.
  • Se você deseja enviar muitos arquivos em uma única solicitação, use o multipleatributo: <input multiple type=... />e anexe todos os arquivos escolhidos ao formData de maneira semelhante (por exemplo photo2=...files[2];... formData.append("photo2", photo2);)
  • Você pode incluir dados adicionais (json) para solicitar, por exemplo let user = {name:'john', age:34}, desta maneira:formData.append("user", JSON.stringify(user));
  • Essas soluções devem funcionar em todos os principais navegadores.
Kamil Kiełczewski
fonte
Funciona perfeitamente para mim.
Trieu Nguyen
formData === envio de formuláriosenctype="multipart/form-data"
xgqfrms 14/02
Estou recebendo erronet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman
@HidaytRahman esse erro geralmente aparece quando o servidor não implementa o método POST para o seu URL
Kamil Kiełczewski
1
Estranho - De acordo com seu título, eu estava pensando que não precisamos mais do servidor: D
Hidayt Rahman 10/03