没有表格的文件上传


93

不使用任何形式,我可以<input type="file">使用jQuery使用POST方法将文件从发送到“ upload.php”。输入标签不在任何表单标签内。它单独站立。所以我不想使用jQuery插件,例如“ ajaxForm”或“ ajaxSubmit”。


1
尝试以下操作:uploadify.com,但使用Flash版本。来吧,扔石头。我不确定HTML5版本是否可以不使用表单。可能会,但我不确定。
Ismael Miguel

1
Arrr ....我想说它应该在HTML 5中工作。但是,您将在平台兼容性方面泛滥,因为浏览器已经过了几年。创建表格或从地狱动态生成表格有什么害处?
伊扎克2015年

Answers:


93

您可以使用FormData通过POST请求提交数据。这是一个简单的示例:

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
});

只要知道请求设置(例如url,方法和参数数据),就不必使用表单来发出ajax请求。


恕我直言,这是最好的解决方案,但是另一种选择是在内部使用<iframe,您可以进行定期回发
John Smith

是的,这是真的。旧版浏览器不支持FormData和Ajax上传文件,如果使用iframe作为这些浏览器的后备产品,则不提供解决方案。
Omid Monshizadeh 2014年

7
不要忘记添加processData: false和添加contentType: false到设置对象,否则您将收到Uncaught TypeError:非法调用
jsmiff 2015年

2
老兄,你救了我的命!:D谢谢@monshi和@ jsmiff。(SOF禁止同一评论中的多个用户)。
Silvio Delgado

4
pictureInput在这里是什么?
developersaumya

30

这里的所有答案仍在使用FormData API。就像"multipart/form-data"没有表格的上传一样。您还可以使用以下方法将文件作为内容直接上传到POST请求的正文中xmlHttpRequest

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-TypeContent-Disposition标头用于解释我们要发送的内容(MIME类型和文件名)。

我也在这里发布了类似的答案。


1
这是一个很好的答案。完全避免了使用表单数据。我可以向xmlHttpRequest的用法中添加更多内容。XMLHttpRequest允许执行异步操作,这些操作不会阻止客户端(UI页面)。使用HTML表单时,在执行操作时客户端(UI页面)被阻止。
哈里

fetch()
Vitaly Zdanevich

@VitalyZdanevich不知道您的意思是什么?
威尔特

这种方法在IE上有效吗?
托尼·科布

13

基于本教程,这里有一个非常基本的方法:

$('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){
            ...
        }
        ...
    }); 
});

不要忘记添加适当的错误处理


11

第1步:创建HTML页面,将HTML代码放置在其中。

步骤2:在HTML代码页的底部(页脚)中,创建Javascript:并将Jquery代码放在Script标签中。

步骤3:建立PHP档案和php程式码复制过去。在$.ajax代码URL中的Jquery Code之后,在您的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" />

p

print_r($_FILES);
print_r($_POST);

1
请为您的代码添加一些注释/说明
kvorobiev

错过,之后type: 'post'
Rust

1
让我开心:)谢谢
shekhardtu

您可以在tmp提交完整表单之前将文件上传到目录吗?(说这是多种形式)?
thesayhey

我如何在Java代码中参考这些表单变量
卜哈斯卡瑞Arani

1

试试这个puglin simpleUpload,不需要表单

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');

  }
});

1

遗憾的是那家伙,但AngularJS提供了一个简单而优雅的解决方案。

这是我使用的代码:

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>

在服务器端,我有一个带有动作的MVC控制器,该动作将保存在Request.Files集合中找到的上载文件并返回JsonResult。

如果您使用AngularJS,请尝试一下,如果您不这样做...对不起队友:-)


投票失败,因为不适用于$ upload指令
NicoJuicy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.