jQuery Ajax 文件上传

jQuery Ajax File Upload

提问人:Willy 提问时间:2/24/2010 最后编辑:Kamil KiełczewskiWilly 更新时间:11/14/2023 访问量:1793384

问:

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

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

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

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

javascript jquery ajax post 文件上传

评论

1赞 Nathan Koop 8/22/2013
相关问题:stackoverflow.com/questions/6974684/...
2赞 Timo Huovinen 1/29/2014
相关新闻: stackoverflow.com/questions/166221/...
0赞 antyrat 2/24/2010
Ajax 不支持文件上传,您应该改用 iframe

答:

640赞 Adeel 2/24/2010 #1

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


更新

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

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

  • IE浏览器 10+
  • 火狐浏览器 4.0+
  • 铬 7+
  • Safari 浏览器 5+
  • 歌剧 12+

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

评论

44赞 Ryan White 10/3/2012
以下是不支持的特定浏览器的列表: caniuse.com/#search=FormData 我还没有测试过这个,但这里有一个 polyfill 用于 FormData gist.github.com/3120320
168赞 Kevin 11/1/2012
具体来说,IE < 10 没有,对于那些懒得阅读链接的人来说。
26赞 Drew Calder 3/6/2014
@Synexis不,我们不必再等那么久了,因为所有IE在全球的市场份额只有22%,在美国只有27%,而且下降得很快。很可能是 70 岁以上的人。因此,与其让 IE 决定开发人员必须做什么,不如让 IE 要么必须成型,要么退出竞争。
36赞 Nicolas Connault 6/18/2014
@DrewCalder 大多数 IE 用户都是办公室工作人员,由于公司政策,他们无法选择使用哪个浏览器。我不认为年龄与它有太大关系。我猜大多数 70 >的人都会让他们的后代安装 Chrome 或 FF 而不是:)
4赞 Luminous 7/30/2015
这个链接确实帮助我了解了最低限度的内容。我不必使用 xhr 请求。如果您确实使用 ajax,请确保将 设置为 !enctype"form/multipart"
16赞 Manki 8/7/2011 #2
  • 使用隐藏的 iframe,并将表单的目标设置为该 iframe 的名称。这样,在提交表单时,只会刷新 iframe。
  • 为 iframe 的 load 事件注册一个事件处理程序来分析响应。

评论

0赞 Bhargav Nanekalva 8/12/2015
尽可能避免使用 iframe
1赞 aswzen 4/7/2018
@BhargavNanekalva你担心什么?
0赞 Martin Zvarík 7/28/2020
我认为提交时会发出咔哒声......它更像是不适合 2020 年的解决方法,但在 IE 7 中有效
35赞 koppor 4/2/2012 #3

AJAX 上传确实是可能的。无需 iframe。可以显示上传进度。XMLHttpRequest()

有关详细信息,请参阅:回答问题 jQuery 上传进度和 AJAX 文件上传 https://stackoverflow.com/a/4943774/873282

评论

24赞 Sasha Chedygov 12/11/2012
不幸的是,IE < 10 不支持此功能。
1赞 mickmackusa 11/24/2019
当您只想引用另一个页面作为答案时,您可以投票关闭为重复或在问题下发表评论。这篇文章不是答案。这种帖子看起来像是试图耕种代表。
382赞 JohannesAndersson 5/30/2012 #4

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

将 HTML5 文件上传与 AJAX 和 jQuery 结合使用

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 + "%");
};

如何使用 Upload 类

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

评论

4赞 JohannesAndersson 6/14/2012
您可以或多或少地直接复制代码并使用它。只需更改一些 ID 名称和类名称即可。任何定制都是由您自己决定的。
4赞 awatts 8/10/2012
请注意,myXhr 似乎是全局的,名称、大小和类型也是如此。此外,最好使用“beforeSend”来扩充已经创建的 XMLHttpRequest 对象,而不是使用“xhr”创建一个然后更改它。
8赞 tandrewnichols 5/21/2013
我不认为我们可以像@Ziinloader那样使用它。您正在使用一些未包含的本地方法:。什么?writer(catchFile)writer()
4赞 raju 4/30/2014
如果数据还包含很少的字段以及要上传的文件怎么办?
5赞 Regular Jo 10/11/2017
@Ziinloader这是一个非常有用的例子,我看到你已经多次回来维护了。确实是一个比我能给出的赞成票更有价值的答案。
19赞 lgersman 9/17/2012 #5

如果你想这样做:

$.upload( form.action, new FormData( myForm))
.progress( function( progressEvent, upload) {
    if( progressEvent.lengthComputable) {
        var percent = Math.round( progressEvent.loaded * 100 / progressEvent.total) + '%';
        if( upload) {
            console.log( percent + ' uploaded');
        } else {
            console.log( percent + ' downloaded');
        }
    }
})
.done( function() {
    console.log( 'Finished upload');                    
});

https://github.com/lgersman/jquery.orangevolt-ampere/blob/master/src/jquery.upload.js

可能是你的解决方案。

评论

0赞 coolesting 12/20/2012
$ 对象中的上传方法在哪里,上面的链接不存在
2赞 Andrew Barber 4/8/2013
感谢您发布您的答案!请务必仔细阅读有关自我推销的常见问题。另请注意,每次链接到您自己的网站/产品时,您都必须发布免责声明。
18赞 Gvice 1/29/2013 #6
$("#submit_car").click(function() {
  var formData = new FormData($('#car_cost_form')[0]);
  $.ajax({
     url: 'car_costs.php',
     data: formData,
     contentType: false,
     processData: false,
     cache: false,
     type: 'POST',
     success: function(data) {
       // ...
     },
  });
});

编辑:注意 contentype 和过程数据 你可以简单地使用它通过 Ajax 上传文件......提交输入不能位于表单元素:)之外

评论

6赞 Jomy John 10/9/2013
使用此方法,您可以发布表单,但不能发布“文件”类型的字段。这个问题是关于文件上传的。
1赞 Jonathan 8/12/2021
这是方法:“POST”不是type: 'POST'
3赞 Fallenreaper 10/31/2013 #7

这是我想到的一个想法:

Have an iframe on page and have a referencer.

具有将输入类型文件元素移动到的窗体。

Form:  A processing page AND a target of the FRAME.

结果将发布到 iframe,然后您可以将获取的数据发送到您想要的图像标签,如下所示:

data:image/png;base64,asdfasdfasdfasdfa

并加载页面。

我相信它对我有用,并且根据您的情况,您可以做以下事情:

.aftersubmit(function(){
    stopPropagation(); // or some other code which would prevent a refresh.
});

评论

0赞 JDuarteDJ 8/14/2018
我看不出这如何改善之前给出的任何其他答案。此外,这是传播而不是繁殖!;)
6赞 Quy Le 2/16/2014 #8

您可以使用方法ajaxSubmit,如下所示:) 当您选择需要上传到服务器的文件时,表单将提交到服务器:)

$(document).ready(function () {
    var options = {
    target: '#output',   // target element(s) to be updated with server response
    timeout: 30000,
    error: function (jqXHR, textStatus) {
            $('#output').html('have any error');
            return false;
        }
    },
    success: afterSuccess,  // post-submit callback
    resetForm: true
            // reset the form after successful submit
};

$('#idOfInputFile').on('change', function () {
    $('#idOfForm').ajaxSubmit(options);
    // always return false to prevent standard browser submit and page navigation
    return false;
});
});

评论

2赞 fotanus 7/5/2014
我相信你说的是jquery表单插件。这确实是这里最好的选择,除了你的答案中缺乏细节。
0赞 Quy Le 7/13/2014
@fotanus你是对的!该脚本必须使用jquery表单插件提交使用jquery表单插件中定义的ajaxSubmit方法
74赞 lee8oi 3/25/2014 #9

我为此已经很晚了,但我正在寻找一个基于 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";
}
?>

评论

0赞 Brownman Revival 2/21/2015
我明白为什么会这样,先生,我按原样复制粘贴您的代码Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,
2赞 colincameron 3/18/2015
@HogRider - 如果你用谷歌搜索你的错误消息,这是第一个结果:stackoverflow.com/questions/10752055/......您是否通过 而不是使用 Web 服务器在本地访问您的网页?顺便说一句,在不首先理解代码的情况下盲目复制和粘贴代码并不是最佳做法。我建议您在使用代码之前逐行浏览代码,以了解正在发生的事情。file://
0赞 Brownman Revival 3/19/2015
@colincameron感谢您澄清一些事情,我确实逐行浏览了它,但我真的不太了解,所以我问了这个问题,以便有人可以澄清我的疑问。确切地说,我是通过 xampp 方式使用本地的。我可以问一个也许你可以澄清的问题吗?
0赞 Adarsh Mohan 11/22/2015
@Brownman 复兴 : 我知道现在回复为时已晚。您收到跨域错误,因为您将 html 文件作为文件打开,而不是从服务器运行它。
0赞 Rayden Black 12/16/2015
如何根据此代码中的选择应用表单操作?
261赞 pedrozopayares 7/25/2014 #10

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

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 对象,该对象为空或 from (serialized? - 现有表单),然后附加输入文件。$('#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
            ));
}

评论

2赞 Rayden Black 12/16/2015
我需要引用什么jquery库来运行此代码?
6赞 Yakob Ubaidi 8/5/2016
formData.append('file', $('#file')[0].files[0]);返回并且除了undefinedconsole.log(formData)_proto_
7赞 TARKUS 1/31/2017
我让它起作用了......捏我,我在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); } });
2赞 Ted Bigham 6/28/2018
@RaymondWachaga 这是编码类型,而不是加密类型。:)
2赞 Damoiskii 7/23/2021
我真的很挣扎......经过几个小时的研究等等,我发现这真的很有帮助。谢谢伙计!您的解决方案的第一部分对我来说就像一个魅力。这正是我需要的:-)
8赞 Piacenti 10/12/2014 #11

是的,你可以,只需使用 javascript 获取文件,确保将文件读取为数据 URL。解析 base64 之前的内容以实际获取 base 64 编码的数据,然后如果您使用的是 php 或任何后端语言,则可以解码 base 64 数据并保存到如下所示的文件中

Javascript:
var reader = new FileReader();
reader.onloadend = function ()
{
  dataToBeSent = reader.result.split("base64,")[1];
  $.post(url, {data:dataToBeSent});
}
reader.readAsDataURL(this.files[0]);


PHP:
    file_put_contents('my.pdf', base64_decode($_POST["data"]));

当然,您可能希望进行一些验证,例如检查您正在处理的文件类型之类的东西,但这就是想法。

评论

0赞 Nande 5/21/2016
file_put_contents($fname, file_get_contents($_POST['data']));file_get_contents处理解码和 data:// 标头
9赞 Ima 12/23/2014 #12

在通过ajax从预览中删除不需要的文件后,我已经实现了具有即时预览和上传功能的多文件选择。

详细文档可在此处找到:http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

演示:http://jsfiddle.net/anas/6v8Kz/7/embedded/result/

jsFiddle:http://jsfiddle.net/anas/6v8Kz/7/

Javascript的:

    $(document).ready(function(){
    $('form').submit(function(ev){
        $('.overlay').show();
        $(window).scrollTop(0);
        return upload_images_selected(ev, ev.target);
    })
})
function add_new_file_uploader(addBtn) {
    var currentRow = $(addBtn).parent().parent();
    var newRow = $(currentRow).clone();
    $(newRow).find('.previewImage, .imagePreviewTable').hide();
    $(newRow).find('.removeButton').show();
    $(newRow).find('table.imagePreviewTable').find('tr').remove();
    $(newRow).find('input.multipleImageFileInput').val('');
    $(addBtn).parent().parent().parent().append(newRow);
}

function remove_file_uploader(removeBtn) {
    $(removeBtn).parent().parent().remove();
}

function show_image_preview(file_selector) {
    //files selected using current file selector
    var files = file_selector.files;
    //Container of image previews
    var imageContainer = $(file_selector).next('table.imagePreviewTable');
    //Number of images selected
    var number_of_images = files.length;
    //Build image preview row
    var imagePreviewRow = $('<tr class="imagePreviewRow_0"><td valign=top style="width: 510px;"></td>' +
        '<td valign=top><input type="button" value="X" title="Remove Image" class="removeImageButton" imageIndex="0" onclick="remove_selected_image(this)" /></td>' +
        '</tr> ');
    //Add image preview row
    $(imageContainer).html(imagePreviewRow);
    if (number_of_images > 1) {
        for (var i =1; i<number_of_images; i++) {
            /**
             *Generate class name of the respective image container appending index of selected images, 
             *sothat we can match images selected and the one which is previewed
             */
            var newImagePreviewRow = $(imagePreviewRow).clone().removeClass('imagePreviewRow_0').addClass('imagePreviewRow_'+i);
            $(newImagePreviewRow).find('input[type="button"]').attr('imageIndex', i);
            $(imageContainer).append(newImagePreviewRow);
        }
    }
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        /**
         * Allow only images
         */
        var imageType = /image.*/;
        if (!file.type.match(imageType)) {
          continue;
        }

        /**
         * Create an image dom object dynamically
         */
        var img = document.createElement("img");

        /**
         * Get preview area of the image
         */
        var preview = $(imageContainer).find('tr.imagePreviewRow_'+i).find('td:first');

        /**
         * Append preview of selected image to the corresponding container
         */
        preview.append(img); 

        /**
         * Set style of appended preview(Can be done via css also)
         */
        preview.find('img').addClass('previewImage').css({'max-width': '500px', 'max-height': '500px'});

        /**
         * Initialize file reader
         */
        var reader = new FileReader();
        /**
         * Onload event of file reader assign target image to the preview
         */
        reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img);
        /**
         * Initiate read
         */
        reader.readAsDataURL(file);
    }
    /**
     * Show preview
     */
    $(imageContainer).show();
}

function remove_selected_image(close_button)
{
    /**
     * Remove this image from preview
     */
    var imageIndex = $(close_button).attr('imageindex');
    $(close_button).parents('.imagePreviewRow_' + imageIndex).remove();
}

function upload_images_selected(event, formObj)
{
    event.preventDefault();
    //Get number of images
    var imageCount = $('.previewImage').length;
    //Get all multi select inputs
    var fileInputs = document.querySelectorAll('.multipleImageFileInput');
    //Url where the image is to be uploaded
    var url= "/upload-directory/";
    //Get number of inputs
    var number_of_inputs = $(fileInputs).length; 
    var inputCount = 0;

    //Iterate through each file selector input
    $(fileInputs).each(function(index, input){

        fileList = input.files;
        // Create a new FormData object.
        var formData = new FormData();
        //Extra parameters can be added to the form data object
        formData.append('bulk_upload', '1');
        formData.append('username', $('input[name="username"]').val());
        //Iterate throug each images selected by each file selector and find if the image is present in the preview
        for (var i = 0; i < fileList.length; i++) {
            if ($(input).next('.imagePreviewTable').find('.imagePreviewRow_'+i).length != 0) {
                var file = fileList[i];
                // Check the file type.
                if (!file.type.match('image.*')) {
                    continue;
                }
                // Add the file to the request.
                formData.append('image_uploader_multiple[' +(inputCount++)+ ']', file, file.name);
            }
        }
        // Set up the request.
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        xhr.onload = function () {
            if (xhr.status === 200) {
                var jsonResponse = JSON.parse(xhr.responseText);
                if (jsonResponse.status == 1) {
                    $(jsonResponse.file_info).each(function(){
                        //Iterate through response and find data corresponding to each file uploaded
                        var uploaded_file_name = this.original;
                        var saved_file_name = this.target;
                        var file_name_input = '<input type="hidden" class="image_name" name="image_names[]" value="' +saved_file_name+ '" />';
                        file_info_container.append(file_name_input);

                        imageCount--;
                    })
                    //Decrement count of inputs to find all images selected by all multi select are uploaded
                    number_of_inputs--;
                    if(number_of_inputs == 0) {
                        //All images selected by each file selector is uploaded
                        //Do necessary acteion post upload
                        $('.overlay').hide();
                    }
                } else {
                    if (typeof jsonResponse.error_field_name != 'undefined') {
                        //Do appropriate error action
                    } else {
                        alert(jsonResponse.message);
                    }
                    $('.overlay').hide();
                    event.preventDefault();
                    return false;
                }
            } else {
                /*alert('Something went wrong!');*/
                $('.overlay').hide();
                event.preventDefault();
            }
        };
        xhr.send(formData);
    })

    return false;
}

评论

0赞 Ima 8/13/2015
@Bhargav:请参阅博客文章以获取解释:goo.gl/umgFFy。如果您仍有疑问,请回复我谢谢
135赞 vickisys 1/19/2015 #13

简单上传表格

<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>

评论

0赞 Brownman Revival 2/24/2015
先生,此示例中使用的 JS 是什么,是否有针对此示例的特定 jQuery 插件。.我有一个问题,我被指出在这里,你能检查一下我的问题吗?我想在该项目中上传多个文件或图像,这里是链接 stackoverflow.com/questions/28644200/...
27赞 machineaddict 5/20/2016
$(this)[0] 是这个
2赞 FrenkyB 10/27/2017
服务器上发布文件的参数是什么?你能发布服务器部分吗?
0赞 dev_masta 4/30/2018
@FrenkyB 和其他人 - 服务器上的文件(在 PHP 中)不存储在 $_POST 变量中 - 它们存储在 $_FILES 变量中。在这种情况下,您将使用 $_FILES[“csv”] 访问它,因为“csv”是输入标记的 name 属性。
0赞 Tejas Tank 8/11/2023
完全正确。
5赞 Nikunj K. 8/2/2016 #14

如果要使用AJAX上传文件,则可以使用以下代码上传文件。

$(document).ready(function() {
    var options = { 
                beforeSubmit:  showRequest,
        success:       showResponse,
        dataType: 'json' 
        }; 
    $('body').delegate('#image','change', function(){
        $('#upload').ajaxForm(options).submit();        
    }); 
});     
function showRequest(formData, jqForm, options) { 
    $("#validation-errors").hide().empty();
    $("#output").css('display','none');
    return true; 
} 
function showResponse(response, statusText, xhr, $form)  { 
    if(response.success == false)
    {
        var arr = response.errors;
        $.each(arr, function(index, value)
        {
            if (value.length != 0)
            {
                $("#validation-errors").append('<div class="alert alert-error"><strong>'+ value +'</strong><div>');
            }
        });
        $("#validation-errors").show();
    } else {
         $("#output").html("<img src='"+response.file+"' />");
         $("#output").css('display','block');
    }
}

这是上传文件的 HTML

<form class="form-horizontal" id="upload" enctype="multipart/form-data" method="post" action="upload/image'" autocomplete="off">
    <input type="file" name="image" id="image" /> 
</form>
7赞 VISHNU 8/9/2016 #15

要上传用户使用jQuery作为表单的一部分提交的文件,请遵循以下代码:

var formData = new FormData();
formData.append("userfile", fileInputElement.files[0]);

然后将表单数据对象发送到服务器。

我们还可以将 File 或 Blob 直接附加到 FormData 对象。

data.append("myfile", myBlob, "filename.txt");
8赞 David 10/20/2016 #16

要获取所有表单输入,包括 type=“file”,您需要使用 FormData 对象。 提交表单后,您将能够在调试器 -> network ->Headers 中看到 formData 内容。

var url = "YOUR_URL";

var form = $('#YOUR_FORM_ID')[0];
var formData = new FormData(form);


$.ajax(url, {
    method: 'post',
    processData: false,
    contentType: false,
    data: formData
}).done(function(data){
    if (data.success){ 
        alert("Files uploaded");
    } else {
        alert("Error while uploading the files");
    }
}).fail(function(data){
    console.log(data);
    alert("Error while uploading the files");
});
8赞 Nikit Barochiya 3/17/2017 #17
<html>
    <head>
        <title>Ajax file upload</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <script>
            $(document).ready(function (e) {
            $("#uploadimage").on('submit', (function(e) {
            e.preventDefault();
                    $.ajax({
                    url: "upload.php", // Url to which the request is send
                            type: "POST", // Type of request to be send, called as method
                            data: new FormData(this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
                            contentType: false, // The content type used when sending data to the server.
                            cache: false, // To unable request pages to be cached
                            processData:false, // To send DOMDocument or non processed data file it is set to false
                            success: function(data)   // A function to be called if request succeeds
                            {
                            alert(data);
                            }
                    });
            }));
        </script>
    </head>
    <body>
        <div class="main">
            <h1>Ajax Image Upload</h1><br/>
            <hr>
            <form id="uploadimage" action="" method="post" enctype="multipart/form-data">
                <div id="image_preview"><img id="previewing" src="noimage.png" /></div>
                <hr id="line">
                <div id="selectImage">
                    <label>Select Your Image</label><br/>
                    <input type="file" name="file" id="file" required />
                    <input type="submit" value="Upload" class="submit" />
                </div>
            </form>
        </div>
    </body>
</html>
4赞 Jayesh Paunikar 6/9/2017 #18
var dataform = new FormData($("#myform")[0]);
//console.log(dataform);
$.ajax({
    url: 'url',
    type: 'POST',
    data: dataform,
    async: false,
    success: function(res) {
        response data;
    },
    cache: false,
    contentType: false,
    processData: false
});

评论

6赞 S.R 6/9/2017
您可以通过添加一些详细信息来改进您的答案
10赞 Mike Volmar 5/24/2018 #19

正如许多答案所表明的那样,使用 FormData 是要走的路。这里有一些代码非常适合此目的。我也同意嵌套 ajax 块以完成复杂情况的评论。通过包含 e.PreventDefault();根据我的经验,使代码更加跨浏览器兼容。

    $('#UploadB1').click(function(e){        
    e.preventDefault();

    if (!fileupload.valid()) {
        return false;            
    }

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

    $("#UpdateMessage5").html("Uploading file ....");
    $("#UpdateMessage5").css("background","url(../include/images/loaderIcon.gif) no-repeat right");

    myformData.append('mode', 'fileUpload');
    myformData.append('myid', $('#myid').val());
    myformData.append('type', $('#fileType').val());
    //formData.append('myfile', file, file.name); 

    $.ajax({
        url: 'include/fetch.php',
        method: 'post',
        processData: false,
        contentType: false,
        cache: false,
        data: myformData,
        enctype: 'multipart/form-data',
        success: function(response){
            $("#UpdateMessage5").html(response); //.delay(2000).hide(1); 
            $("#UpdateMessage5").css("background","");

            console.log("file successfully submitted");
        },error: function(){
            console.log("not okay");
        }
    });
});

评论

0赞 Mike Volmar 5/24/2018
这将通过jquery validate ...if (!fileupload.valid()) { 返回 false;
29赞 М.Б. 12/22/2018 #20

这是我如何做到这一点的:

[HTML全文]

<input type="file" id="file">
<button id='process-file-button'>Process</button>

JS系列

$('#process-file-button').on('click', function (e) {
    let files = new FormData(), // you can consider this as 'data bag'
        url = 'yourUrl';

    files.append('fileName', $('#file')[0].files[0]); // append selected file to the bag named 'file'

    $.ajax({
        type: 'post',
        url: url,
        processData: false,
        contentType: false,
        data: files,
        success: function (response) {
            console.log(response);
        },
        error: function (err) {
            console.log(err);
        }
    });
});

PHP的

if (isset($_FILES) && !empty($_FILES)) {
    $file = $_FILES['fileName'];
    $name = $file['name'];
    $path = $file['tmp_name'];


    // process your file

}

评论

3赞 ffgpga08 1/19/2019
对我帮助最大的是某种奇怪的 JS 解决方法,不需要适当的$('#file')[0].files[0]<form>
2赞 cdsaenz 7/27/2019
这是完整的解决方案,PHP位也有帮助。
17赞 Jay 3/13/2019 #21

2019年更新:

[HTML全文]

<form class="fr" method='POST' enctype="multipart/form-data"> {% csrf_token %}
<textarea name='text'>
<input name='example_image'>
<button type="submit">
</form>

JS的

$(document).on('submit', '.fr', function(){

    $.ajax({ 
        type: 'post', 
        url: url, <--- you insert proper URL path to call your views.py function here.
        enctype: 'multipart/form-data',
        processData: false,
        contentType: false,
        data: new FormData(this) ,
        success: function(data) {
             console.log(data);
        }
        });
        return false;

    });

views.py

form = ThisForm(request.POST, request.FILES)

if form.is_valid():
    text = form.cleaned_data.get("text")
    example_image = request.FILES['example_image']

评论

3赞 dirkgroten 3/14/2019
这如何改善已经给出的任何答案?此外,这个答案提到了一个 views.py 文件,它是 Django,与问题无关。
29赞 Kamil Kiełczewski 7/5/2019 #22

使用纯js更容易

async function saveFile(inp) 
{
    let formData = new FormData();           
    formData.append("file", inp.files[0]);
    await fetch('/upload/somedata', {method: "POST", body: formData});    
    alert('success');
}
<input type="file" onchange="saveFile(this)" >

  • 在服务器端,您可以读取原始文件名(和其他信息),这些信息会自动包含在请求中。
  • 您不需要将标题“Content-Type”设置为“multipart/form-data”,浏览器会自动设置它
  • 此解决方案应适用于所有主流浏览器。

以下是更发达的代码片段,其中包含错误处理、超时和其他 json 发送

async function saveFile(inp) 
{
    let user = { name:'john', age:34 };
    let formData = new FormData();
    let photo = inp.files[0];      
         
    formData.append("photo", photo);
    formData.append("user", JSON.stringify(user));  
    
    const ctrl = new AbortController() // timeout
    setTimeout(() => ctrl.abort(), 50000);

    try {
       let r = await fetch('/upload/image', 
         {method: "POST", body: formData, signal: ctrl.signal}); 
       console.log('HTTP response code:',r.status); 
       alert('success');
    } catch(e) {
       console.log('Huston we have problem...:', e);
    }
    
}
<input type="file" onchange="saveFile(this)" >
<br><br>
Before selecting the file Open chrome console > network tab to see the request details.
<br><br>
<small>Because in this example we send request to https://stacksnippets.net/upload/image the response code will be 404 ofcourse...</small>

评论

0赞 Said Torres 12/6/2022
最佳答案,而且,代码更短。
20赞 delboy1978uk 10/31/2019 #23

使用 FormData。它真的很好用:-)......

var jform = new FormData();
jform.append('user',$('#user').val());
jform.append('image',$('#image').get(0).files[0]); // Here's the important bit

$.ajax({
    url: '/your-form-processing-page-url-here',
    type: 'POST',
    data: jform,
    dataType: 'json',
    mimeType: 'multipart/form-data', // this too
    contentType: false,
    cache: false,
    processData: false,
    success: function(data, status, jqXHR){
        alert('Hooray! All is well.');
        console.log(data);
        console.log(status);
        console.log(jqXHR);

    },
    error: function(jqXHR,status,error){
        // Hopefully we should never reach here
        console.log(jqXHR);
        console.log(status);
        console.log(error);
    }
});

评论

0赞 rahim.nagori 3/26/2020
这就是: ('user',$('#user').val());
0赞 Alp Altunel 4/5/2020
将 id=“user” 的文本框附加到 @rahim.nagori 格式
1赞 André Morales 6/6/2020
更直接的方法: var jform = new FormData($('form').get(0));
0赞 delboy1978uk 6/6/2020
很好,谢谢,下次我使用 FormData 时会尝试
1赞 Madhawa Madhuranga 3/24/2021 #24

$("#form-id").submit(function (e) {
   e.preventDefault();
});

$("#form-id").submit(function (e) {

     var formObj = $(this);
     var formURL = formObj.attr("action");
     var formData = new FormData(this);
          $.ajax({
             url: formURL,
             type: 'POST',
             data: formData,
             processData: false,
             contentType: false,
             async: true,
             cache: false,
             enctype: "multipart/form-data",
             dataType: "json",
             success: function (data) {
                 if (data.success) {
                        alert(data.success)
                 } 
                                
                 if  (data.error) {
                        alert(data.error)
                 } 
             }
         });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<form class="form-horizontal" id="form-id" action="masterFileController" enctype="multipart/form-data">
    <button class="btn-success btn" type="submit" id="btn-save" >Submit</button>
</form>

servlet 响应为 “out.print(”your response“);”

4赞 Abhishek Kanrar 7/17/2021 #25
<input class="form-control cu-b-border" type="file" id="formFile">
<img id="myImg" src="#">

在js中

<script>
    var formData = new FormData();
    formData.append('file', $('#formFile')[0].files[0]);
    $.ajax({
        type: "POST",
        url: '/GetData/UploadImage',
        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);
            $('#myImg').attr('src', data);
        },
        error: function (xhr, ajaxOptions, thrownError) {
        }
    })
</script>

在控制器中

public ActionResult UploadImage(HttpPostedFileBase file)
        {
            string filePath = "";
            if (file != null)
            {
                string path = "/uploads/Temp/";
                if (!Directory.Exists(Server.MapPath("~" + path)))
                {
                    Directory.CreateDirectory(Server.MapPath("~" + path));
                }
                filePath = FileUpload.SaveUploadedFile(file, path);
            }
            
            return Json(filePath, JsonRequestBehavior.AllowGet);
        }
2赞 keivan kashani 9/23/2021 #26

这是我的代码,它有效

var formData = new FormData();
var files = $('input[type=file]');
for (var i = 0; i < files.length; i++) {
if (files[i].value == "" || files[i].value == null) {
 return false;
}
else {
 formData.append(files[i].name, files[i].files[0]);
}
}
var formSerializeArray = $("#Form").serializeArray();
for (var i = 0; i < formSerializeArray.length; i++) {
  formData.append(formSerializeArray[i].name, formSerializeArray[i].value)
}
$.ajax({
 type: 'POST',
 data: formData,
 contentType: false,
 processData: false,
 cache: false,
 url: '/Controller/Action',
 success: function (response) {
 if (response.Success == true) {
    return true;
 }
 else {
    return false;
 }
 },
 error: function () {
   return false;
 },
 failure: function () {
   return false;
 }
 });
0赞 Chris Moschini 11/14/2023 #27

使用 jQuery3 和 .Net 的 2023 年解决方案

HTML格式:

<form>
  <input type=file /> <button class=upload>Upload</button>
</form>

JS:

$('button.upload').closest('form').on('submit', ev => {
  ev.preventDefault();
  const form = $(ev.target);
  const files = form.find('input[type=file]')[0].files;
  const formData = new FormData();
  formData.append('upload', files[0]);

  $.ajax({
    url: '/manage/upload',
    type: 'POST',
    data: formData,
    encType: 'multipart/form-data',  
    contentType: false,
    processData: false
  })
  .done(r => {
    debugger;
  });

  return false;
});

Asp.Net MVC 控制器:

[HttpPost]
public async Task<JsonResult> Upload(HttpPostedFileBase upload)
{
  string s = null;
  using (upload.InputStream)
    using (var reader = new StreamReader(stream, true))
      s = await reader.ReadToEndAsync();

  // Do something with the uploaded contents of the file
  return Json(true);
}

关于此代码的说明:

formData.upload('<name goes here>',...- 在这种情况下, - 必须与 .Net Controller Action 中的参数名称匹配 (),因此,如果您将 AJAX 调用中的键从 'upload' 更改为 ,则需要更改 Action 参数,就像您希望这很容易一样。它可以在不匹配这些表单正文键的情况下完成,但是,这是一堆额外的工作。'upload'HttpPostedFileBase upload'file'HttpPostedFileBase file

此代码假定您的窗体中只有 1 个文件上传控件。您可以在表单中使用更多上传输入,但它更复杂 - 但使用此代码非常容易,每个表单有 1 个输入类型=文件,以及多个这样的表单/输入对。完全缺乏任何属性的表单是故意的,完全没问题,因为它从来都不是要单独提交任何地方。

在 js 中传递给 ajax 调用的选项的属性应该是控制器上上传操作的路径,无论它在哪里。这里没有什么特别的,只是一个普通的 Web 路径。url

这里的控制器操作恰好在文件是文本文档的前提下使用该文件,但是,您不需要这样做。我只是在少量代码中包括如何阅读它,作为您可以方便地使用它的一件事。

我省略了任何错误处理,以切入正题,并提供尽可能少的代码来使其工作。

提交处理程序中的箭头函数不提供 this 对象,因此,如果您正在考虑使用 or ...在该处理程序中,而不是 ,不要这样做。$(this)this.files$(ev.target)