Upload de arquivo sem formulário

93

Sem usar nenhum formulário, posso apenas enviar um arquivo / arquivos de <input type="file">para 'upload.php' usando o método POST usando jQuery. A tag de entrada não está dentro de nenhuma tag de formulário. É individualmente. Portanto, não quero usar plug-ins jQuery como 'ajaxForm' ou 'ajaxSubmit'.

Elo Peri
fonte
1
Tente isto: uploadify.com, mas use a versão flash. Vamos, jogue sua pedra. Não tenho certeza se a versão HTML5 funciona sem um formulário. Provavelmente vai, mas não tenho certeza.
Ismael Miguel,
1
Arrr .... Eu quero dizer que deve funcionar em HTML 5. Mas você vai estar cheio de problemas de compatibilidade de plataforma e navegadores com mais de alguns anos. Qual seria o mal em criar uma forma, ou gerar dinamicamente uma forma a partir das entranhas?
Yitzhak

Respostas:

93

Você pode usar FormData para enviar seus dados por uma solicitação POST. Aqui está um exemplo simples:

var myFormData = new FormData();
myFormData.append('pictureFile', pictureInput.files[0]);

$.ajax({
  url: 'upload.php',
  type: 'POST',
  processData: false, // important
  contentType: false, // important
  dataType : 'json',
  data: myFormData
});

Você não precisa usar um formulário para fazer uma solicitação ajax, contanto que você conheça a configuração da sua solicitação (como url, método e dados de parâmetros).

Omid Monshizadeh
fonte
IMHO, esta é a melhor solução, no entanto outra opção é usar um <iframe dentro de você pode fazer uma postagem regular de volta
John Smith
Sim, é verdade. Navegadores antigos não suportam FormData e ajax para fazer upload de arquivos e a solução é usar iframe como fallback nesses navegadores.
Omid Monshizadeh
7
Não se esqueça de adicionar processData: falsee contentType: falseao objeto de configurações ou você receberá
Uncaught TypeError
2
Caras, vocês salvaram minha vida !! : D Obrigado @monshi e @ jsmiff. (O SOF não permite vários usuários no mesmo comentário).
Silvio Delgado
4
o que é pictureInput nisso ??
developersaumya
30

Todas as respostas aqui ainda estão usando a API FormData . É como um "multipart/form-data"upload sem formulário. Você também pode fazer upload do arquivo diretamente como conteúdo dentro do corpo da POSTsolicitação usando xmlHttpRequestdesta forma:

var xmlHttpRequest = new XMLHttpRequest();

var file = ...file handle...
var fileName = ...file name...
var target = ...target...
var mimeType = ...mime type...

xmlHttpRequest.open('POST', target, true);
xmlHttpRequest.setRequestHeader('Content-Type', mimeType);
xmlHttpRequest.setRequestHeader('Content-Disposition', 'attachment; filename="' + fileName + '"');
xmlHttpRequest.send(file);

Content-Typee os Content-Dispositioncabeçalhos são usados ​​para explicar o que estamos enviando (tipo MIME e nome do arquivo).

Eu postei uma resposta semelhante também aqui .

Wilt
fonte
1
Esta é uma ótima resposta. Está evitando completamente o uso de dados de formulário. Posso adicionar um pouco mais ao uso de xmlHttpRequest. Um XMLHttpRequest permite que operações assíncronas sejam realizadas, que não bloqueiam o cliente (página da interface do usuário). Ao usar um formulário HTML, o cliente (página da interface do usuário) é bloqueado enquanto a operação está sendo executada.
Harry
Sobre o quê fetch()?
Vitaly Zdanevich
@VitalyZdanevich não tem certeza do que quer dizer com isso?
Wilt
Este método funciona no IE?
Tony Cobb
13

Com base neste tutorial , aqui está uma maneira muito básica de fazer isso:

$('your_trigger_element_selector').on('click', function(){    
    var data = new FormData();
    data.append('input_file_name', $('your_file_input_selector').prop('files')[0]);
    // append other variables to data if you want: data.append('field_name_x', field_value_x);

    $.ajax({
        type: 'POST',               
        processData: false, // important
        contentType: false, // important
        data: data,
        url: your_ajax_path,
        dataType : 'json',  
        // in PHP you can call and process file in the same way as if it was submitted from a form:
        // $_FILES['input_file_name']
        success: function(jsonData){
            ...
        }
        ...
    }); 
});

Não se esqueça de adicionar tratamento de erros adequado

Amazzing
fonte
11

Etapa 1: Crie uma página HTML onde colocar o código HTML.

Etapa 2: Na parte inferior da página de código HTML (rodapé) Crie Javascript: e coloque o código Jquery na tag Script.

Passo 3: Crie um arquivo PHP e copie o código php. depois de Jquery Code in $.ajaxCode url aplique qual deles em seu nome de arquivo php.

JS

//$(document).on("change", "#avatar", function() {   // If you want to upload without a submit button 
$(document).on("click", "#upload", function() {
  var file_data = $("#avatar").prop("files")[0]; // Getting the properties of file from file field
  var form_data = new FormData(); // Creating object of FormData class
  form_data.append("file", file_data) // Appending parameter named file with properties of file_field to form_data
  form_data.append("user_id", 123) // Adding extra parameters to form_data
  $.ajax({
    url: "/upload_avatar", // Upload Script
    dataType: 'script',
    cache: false,
    contentType: false,
    processData: false,
    data: form_data, // Setting the data attribute of ajax with file_data
    type: 'post',
    success: function(data) {
      // Do something after Ajax completes 
    }
  });
});

HTML

<input id="avatar" type="file" name="avatar" />
<button id="upload" value="Upload" />

Php

print_r($_FILES);
print_r($_POST);
Hadiyal Rakesh
fonte
1
Por favor, adicione alguns comentários / descrição para o seu código
kvorobiev
faltando um ,depoistype: 'post'
Ferrugem
1
Fez meu dia :) Obrigado
shekhardtu
você pode enviar um arquivo para um tmpdiretório até que todo o formulário seja enviado? (digamos que fosse um formulário múltiplo)?
thesayhey
Como vou referir essas variáveis ​​de formulário no código java
Bhaskara Arani
1

Experimente este puglin simpleUpload , sem necessidade de formulário

Html:

<input type="file" name="arquivo" id="simpleUpload" multiple >
<button type="button" id="enviar">Enviar</button>

Javascript:

$('#simpleUpload').simpleUpload({
  url: 'upload.php',
  trigger: '#enviar',
  success: function(data){
    alert('Envio com sucesso');

  }
});
Rodrigo Azevedo
fonte
1

Desculpe por ser esse cara, mas o AngularJS oferece uma solução simples e elegante.

Aqui está o código que uso:

ngApp.controller('ngController', ['$upload',
function($upload) {

  $scope.Upload = function($files, index) {
    for (var i = 0; i < $files.length; i++) {
      var file = $files[i];
      $scope.upload = $upload.upload({
        file: file,
        url: '/File/Upload',
        data: {
          id: 1 //some data you want to send along with the file,
          name: 'ABC' //some data you want to send along with the file,
        },

      }).progress(function(evt) {

      }).success(function(data, status, headers, config) {
          alert('Upload done');
        }
      })
    .error(function(message) {
      alert('Upload failed');
    });
  }
};
}]);
.Hidden {
  display: none
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div data-ng-controller="ngController">
  <input type="button" value="Browse" onclick="$(this).next().click();" />
  <input type="file" ng-file-select="Upload($files, 1)" class="Hidden" />
</div>

No lado do servidor, tenho um controlador MVC com uma ação que salva os arquivos carregados encontrados na coleção Request.Files e retorna um JsonResult.

Se você usa AngularJS, tente fazer isso, se não ... desculpe amigo :-)

Shabi_669
fonte
Votos negados