jQuery Ajax 文件上传

IT技术 javascript jquery ajax post file-upload
2020-12-25 23:07:51

我可以使用以下 jQuery 代码通过 ajax 请求的 POST 方法执行文件上传吗?

$.ajax({
    type: "POST",
    timeout: 50000,
    url: url,
    data: dataString,
    success: function (data) {
        alert('success');
        return false;
    }
});

如果可能,我需要填写data部分吗?这是正确的方法吗?我只将文件发布到服务器端。

我一直在谷歌搜索,但我发现的是一个插件,而在我的计划中我不想使用它。至少目前是这样。

6个回答

上传文件是不是有可能通过AJAX。
可以上传文件,无需刷新页面,使用IFrame.
您可以在此处查看更多详细信息


更新

XHR2 支持通过 AJAX 上传文件。例如通过FormData对象,但不幸的是,所有/旧浏览器都不支持它。

FormData 支持从以下桌面浏览器版本开始。

  • 浏览器 10+
  • 火狐 4.0+
  • 铬 7+
  • 野生动物园 5+
  • 歌剧 12+

有关更多详细信息,请参阅MDN 链接

@DrewCalder 大多数 IE 用户是上班族,由于公司政策,他们无法选择使用哪种浏览器。我不认为年龄与它有多大关系。我猜大多数 70 岁以上的人都会让他们的后代安装 Chrome 或 FF :)
2021-02-06 23:07:51
@Synexis 不,我们不必再等那么久,因为所有 IE 仅拥有 22% 的全球市场份额和 27% 的美国市场份额,并且正在迅速下降。很有可能是70岁以上的人。因此,与其说 IE 规定开发人员必须做什么,不如说 IE 要么必须振作起来,要么退出竞争。
2021-02-08 23:07:51
具体来说,IE < 10 不会,因为那些懒得阅读链接的人。
2021-02-16 23:07:51
这个链接真的帮助我理解了最低限度。我不必使用 xhr 请求。如果您确实使用 ajax,请确保enctype"form/multipart"!
2021-02-17 23:07:51
以下是不支持的特定浏览器的列表:caniuse.com/#search=FormData另外我还没有测试过,但这里是 FormData gist.github.com/3120320 的 polyfill
2021-03-01 23:07:51

通过ajax上传文件不再需要iframes。我最近自己做的。查看这些页面:

通过 AJAX 和 jQuery 使用 HTML5 文件上传

http://dev.w3.org/2006/webapi/FileAPI/#FileReader-interface

更新了答案并进行了清理。使用 getSize 函数检查大小或使用 getType 函数检查类型。添加了进度条 html 和 css 代码。

var Upload = function (file) {
    this.file = file;
};

Upload.prototype.getType = function() {
    return this.file.type;
};
Upload.prototype.getSize = function() {
    return this.file.size;
};
Upload.prototype.getName = function() {
    return this.file.name;
};
Upload.prototype.doUpload = function () {
    var that = this;
    var formData = new FormData();

    // add assoc key values, this will be posts values
    formData.append("file", this.file, this.getName());
    formData.append("upload_file", true);

    $.ajax({
        type: "POST",
        url: "script",
        xhr: function () {
            var myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) {
                myXhr.upload.addEventListener('progress', that.progressHandling, false);
            }
            return myXhr;
        },
        success: function (data) {
            // your callback here
        },
        error: function (error) {
            // handle error
        },
        async: true,
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        timeout: 60000
    });
};

Upload.prototype.progressHandling = function (event) {
    var percent = 0;
    var position = event.loaded || event.position;
    var total = event.total;
    var progress_bar_id = "#progress-wrp";
    if (event.lengthComputable) {
        percent = Math.ceil(position / total * 100);
    }
    // update progressbars classes so it fits your code
    $(progress_bar_id + " .progress-bar").css("width", +percent + "%");
    $(progress_bar_id + " .status").text(percent + "%");
};

如何使用上传类

//Change id to your id
$("#ingredient_file").on("change", function (e) {
    var file = $(this)[0].files[0];
    var upload = new Upload(file);

    // maby check size or type here with upload.getSize() and upload.getType()

    // execute upload
    upload.doUpload();
});

进度条html代码

<div id="progress-wrp">
    <div class="progress-bar"></div>
    <div class="status">0%</div>
</div>

进度条 css 代码

#progress-wrp {
  border: 1px solid #0099CC;
  padding: 1px;
  position: relative;
  height: 30px;
  border-radius: 3px;
  margin: 10px;
  text-align: left;
  background: #fff;
  box-shadow: inset 1px 3px 6px rgba(0, 0, 0, 0.12);
}

#progress-wrp .progress-bar {
  height: 100%;
  border-radius: 3px;
  background-color: #f39ac7;
  width: 0;
  box-shadow: inset 1px 1px 10px rgba(0, 0, 0, 0.11);
}

#progress-wrp .status {
  top: 3px;
  left: 50%;
  position: absolute;
  display: inline-block;
  color: #000000;
}
@Ziinloader 这是一个非常有用的示例,我看到您已经多次返回并维护了它。真正的答案比我可以给出的一个投票更有value。
2021-02-11 23:07:51
您可以或多或少地直接复制代码并使用它。只需更改一些 id 名称和类名称。任何习惯都是你自己的。
2021-02-24 23:07:51
请注意, myXhr 似乎是全局的以及名称、大小和类型。此外,最好使用“beforeSend”来扩充已经创建的 XMLHttpRequest 对象,而不是使用“xhr”来创建一个然后更改它。
2021-02-27 23:07:51
如果数据还包含几个字段以及要上传的文件怎么办?
2021-03-05 23:07:51
我认为我们不能像@Ziinloader 那样使用它。您正在使用一些未包含的本地方法:writer(catchFile). 什么是writer()
2021-03-06 23:07:51

Ajax 发布和上传文件是可能的。我正在使用jQuery $.ajax函数来加载我的文件。我尝试使用 XHR 对象,但无法在服务器端使用 PHP 获得结果。

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);

$.ajax({
       url : 'upload.php',
       type : 'POST',
       data : formData,
       processData: false,  // tell jQuery not to process the data
       contentType: false,  // tell jQuery not to set contentType
       success : function(data) {
           console.log(data);
           alert(data);
       }
});

如您所见,您必须创建一个 FormData 对象,为空或来自(序列化? -$('#yourForm').serialize())现有表单,然后附加输入文件。

下面是详细信息: -如何上传使用jQuery.ajax和FORMDATA文件 -上传文件通过jQuery,提供FORMDATA对象,并没有文件名,GET请求

对于 PHP 进程,您可以使用以下内容:

//print_r($_FILES);
$fileName = $_FILES['file']['name'];
$fileType = $_FILES['file']['type'];
$fileError = $_FILES['file']['error'];
$fileContent = file_get_contents($_FILES['file']['tmp_name']);

if($fileError == UPLOAD_ERR_OK){
   //Processes your file here
}else{
   switch($fileError){
     case UPLOAD_ERR_INI_SIZE:   
          $message = 'Error al intentar subir un archivo que excede el tamaño permitido.';
          break;
     case UPLOAD_ERR_FORM_SIZE:  
          $message = 'Error al intentar subir un archivo que excede el tamaño permitido.';
          break;
     case UPLOAD_ERR_PARTIAL:    
          $message = 'Error: no terminó la acción de subir el archivo.';
          break;
     case UPLOAD_ERR_NO_FILE:    
          $message = 'Error: ningún archivo fue subido.';
          break;
     case UPLOAD_ERR_NO_TMP_DIR: 
          $message = 'Error: servidor no configurado para carga de archivos.';
          break;
     case UPLOAD_ERR_CANT_WRITE: 
          $message= 'Error: posible falla al grabar el archivo.';
          break;
     case  UPLOAD_ERR_EXTENSION: 
          $message = 'Error: carga de archivo no completada.';
          break;
     default: $message = 'Error: carga de archivo no completada.';
              break;
    }
      echo json_encode(array(
               'error' => true,
               'message' => $message
            ));
}
我需要引用什么 jquery 库来运行此代码?
2021-02-10 23:07:51
我真的为此苦苦挣扎......经过数小时的研究等,我发现这真的很有帮助。谢了哥们!您的解决方案的第一部分对我来说就像一个魅力。这正是我需要的:-)
2021-02-20 23:07:51
@RaymondWachaga 那是编码类型,而不是加密类型。:)
2021-03-03 23:07:51
formData.append('file', $('#file')[0].files[0]);返回undefined并且console.log(formData) 除了_proto_
2021-03-05 23:07:51
我得到了这个工作......捏我,我在jQuery Ajax文件上传天堂! var formData = new FormData(); formData.append('file', document.getElementById('file').files[0]); $.ajax({ url : $("form[name='uploadPhoto']").attr("action"), type : 'POST', data : formData, processData: false, // tell jQuery not to process the data contentType: false, // tell jQuery not to set contentType success : function(data) { console.log(data); alert(data); } });
2021-03-05 23:07:51

简单上传表格

 <script>
   //form Submit
   $("form").submit(function(evt){	 
      evt.preventDefault();
      var formData = new FormData($(this)[0]);
   $.ajax({
       url: 'fileUpload',
       type: 'POST',
       data: formData,
       async: false,
       cache: false,
       contentType: false,
       enctype: 'multipart/form-data',
       processData: false,
       success: function (response) {
         alert(response);
       }
   });
   return false;
 });
</script>
<!--Upload Form-->
<form>
  <table>
    <tr>
      <td colspan="2">File Upload</td>
    </tr>
    <tr>
      <th>Select File </th>
      <td><input id="csv" name="csv" type="file" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="submit"/> 
      </td>
    </tr>
  </table>
</form>

$(this)[0]这个
2021-02-08 23:07:51
服务器上发布文件的参数是什么?可以请你发布服务器部分。
2021-02-15 23:07:51
先生,这个例子中使用的 js 是什么,这个插件有特定的 jquery 插件吗?是链接stackoverflow.com/questions/28644200/...
2021-02-22 23:07:51
@FrenkyB 和其他人 - 服务器上的文件(在 PHP 中)未存储在 $_POST 变量中 - 它们存储在 $_FILES 变量中。在这种情况下,您将使用 $_FILES["csv"] 访问它,因为 "csv" 是输入标签的名称属性。
2021-02-26 23:07:51

我已经很晚了,但我一直在寻找基于 ajax 的图像上传解决方案,而我正在寻找的答案在这篇文章中有点分散。我确定的解决方案涉及 FormData 对象。我组装了我放在一起的代码的基本形式。您可以看到它演示了如何使用 fd.append() 向表单添加自定义字段以及如何在 ajax 请求完成时处理响应数据。

上传html:

<!DOCTYPE html>
<html>
<head>
    <title>Image Upload Form</title>
    <script src="//code.jquery.com/jquery-1.9.1.js"></script>
    <script type="text/javascript">
        function submitForm() {
            console.log("submit event");
            var fd = new FormData(document.getElementById("fileinfo"));
            fd.append("label", "WEBUPLOAD");
            $.ajax({
              url: "upload.php",
              type: "POST",
              data: fd,
              processData: false,  // tell jQuery not to process the data
              contentType: false   // tell jQuery not to set contentType
            }).done(function( data ) {
                console.log("PHP Output:");
                console.log( data );
            });
            return false;
        }
    </script>
</head>

<body>
    <form method="post" id="fileinfo" name="fileinfo" onsubmit="return submitForm();">
        <label>Select a file:</label><br>
        <input type="file" name="file" required />
        <input type="submit" value="Upload" />
    </form>
    <div id="output"></div>
</body>
</html>

如果您正在使用 php,这里有一种处理上传的方法,包括使用上述 html 中演示的两个自定义字段。

上传.php

<?php
if ($_POST["label"]) {
    $label = $_POST["label"];
}
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 200000)
&& in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } else {
        $filename = $label.$_FILES["file"]["name"];
        echo "Upload: " . $_FILES["file"]["name"] . "<br>";
        echo "Type: " . $_FILES["file"]["type"] . "<br>";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

        if (file_exists("uploads/" . $filename)) {
            echo $filename . " already exists. ";
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "uploads/" . $filename);
            echo "Stored in: " . "uploads/" . $filename;
        }
    }
} else {
    echo "Invalid file";
}
?>
@HogRider - 如果你用谷歌搜索你的错误信息,这是第一个结果:stackoverflow.com/questions/10752055/...你是通过 本地访问你的网页file://,而不是使用网络服务器?顺便说一句,在没有先理解代码的情况下盲目地简单地复制和粘贴代码并不是最佳做法。我建议您在使用代码之前逐行阅读代码以了解正在发生的事情。
2021-02-07 23:07:51
Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,明白为什么会这样,所以先生,我按原样复制粘贴您的代码
2021-02-09 23:07:51
@Brownman Revival :我知道回复太晚了..您遇到了跨源错误,因为您将 html 文件作为文件打开而不是从服务器运行它。
2021-02-12 23:07:51
@colincameron 感谢您澄清一些我确实逐行检查过的事情,但我不太明白,所以我提出了这个问题,以便有人可以澄清我的疑虑。确切地说,我正在通过 xampp 使用本地。我可以问一个你可以澄清的问题吗?
2021-02-16 23:07:51
如何根据此代码中的选择应用表单操作?
2021-02-26 23:07:51