【问题标题】:File Upload without Form无表格文件上传
【发布时间】:2013-11-06 05:36:27
【问题描述】:

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

【问题讨论】:

  • Arrr.... 我想说它应该在 HTML 5 中工作。但是几年前的浏览器会充斥平台兼容性问题。创建表单或从下界动态生成表单有什么害处?

标签: javascript jquery html


【解决方案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');

  }
});

【讨论】:

    【解决方案2】:

    基于this tutorial,这里有一个非常基本的方法:

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

    不要忘记添加正确的错误处理

    【讨论】:

      【解决方案3】:

      您可以使用 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
      });
      

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

      【讨论】:

      • 恕我直言,这是最好的解决方案,但是另一种选择是使用
      • 不要忘记将processData: falsecontentType: false 添加到设置对象,否则您将收到 Uncaught TypeError: Illegal invocation
      • 伙计们,你们救了我的命!! :D 谢谢@monshi 和@jsmiff。(SOF 不允许多个用户在同一评论中)。
      • 这里面的pictureInput是什么??
      • @developersaumya pictureinput 是文件输入 DOM 元素。
      【解决方案4】:

      很抱歉成为那个人,但 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 指令
      【解决方案5】:

      这里的所有答案仍然使用FormData API。这就像没有表单的"multipart/form-data" 上传。您还可以使用 xmlHttpRequest 直接将文件作为内容上传到 POST 请求的正文中,如下所示:

      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 类型和文件名)。

      我也发布了类似的答案here

      【讨论】:

      • 这是一个很好的答案。它完全避免了表单数据的使用。我可以在 xmlHttpRequest 的使用中添加更多内容。 XMLHttpRequest 允许执行异步操作,这不会阻塞客户端(UI 页面)。使用 HTML 表单时,客户端(UI 页面)在执行操作时被阻止。
      • fetch() 呢?
      • @VitalyZdanevich 不确定你的意思?
      • @Harry,我相信您知道这里大多数答案使用的 AJAX 也依赖于 xmlHttpRequest。而且,如果您使用 FormData() 而不是在 HTML 中编写实际表单,则不会出现阻塞。干杯
      【解决方案6】:

      第 1 步:创建 HTML 页面以放置 HTML 代码。

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

      第3步:创建PHP文件和php代码拷贝过去。在 $.ajax 代码 url 中的 Jquery 代码之后,将哪一个应用于您的 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);
      

      【讨论】:

      • 请为您的代码添加一些 cmets/描述
      • type: 'post' 之后缺少,
      • 让我开心:) 谢谢
      • 在整个表单提交之前,您可以将文件上传到tmp 目录吗? (说它是一种多形式)?
      • 如何在java代码中引用这些表单变量
      【解决方案7】:

      非 jquery (React) 版本:

      JS:

      function fileInputUpload(e){
      
          let formData = new FormData();
          formData.append(e.target.name, e.target.files[0]);
      
          let response = await fetch('/api/upload', {
            method: 'POST',
            body: formData
          });
      
          let result = await response.json();
      
          console.log(result.message);
      }
      

      HTML/JSX:

      <input type='file' name='fileInput' onChange={(e) => this.fileInput(e)} />
      

      您可能不想使用 onChange,但您可以将上传部分附加到任何其他函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 2012-12-10
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多