jQuery के अजाक्स फ़ाइल अपलोड


755

क्या मैं ajax अनुरोध के POST विधि का उपयोग करके फ़ाइल अपलोड करने के लिए निम्न jQuery कोड का उपयोग कर सकता हूं?

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

यदि यह संभव है, तो क्या मुझे dataभाग भरने की आवश्यकता है ? क्या यह सही तरीका है? मैं केवल फ़ाइल को सर्वर साइड में पोस्ट करता हूं।

मैं चारों ओर गुगली कर रहा हूं, लेकिन मुझे जो मिला वह एक प्लगइन था जबकि मेरी योजना में मैं इसका उपयोग नहीं करना चाहता। कम से कम एक पल के लिए।


Ajax फ़ाइल अपलोड का समर्थन नहीं करता है, आपको इसके बजाय iframe का उपयोग करना चाहिए
antyrat

1
संबंधित प्रश्न: stackoverflow.com/questions/6974684/…
नाथन कोप

जवाबों:


596

AJAX के माध्यम से फ़ाइल अपलोड संभव नहीं है।
आप का उपयोग करके पेज ताज़ा किए बिना, फ़ाइल अपलोड कर सकते हैं IFrame
आप यहां अधिक विवरण देख सकते हैं


अपडेट करें

XHR2 के साथ, AJAX के माध्यम से फ़ाइल अपलोड समर्थित है। जैसे FormDataऑब्जेक्ट के माध्यम से , लेकिन दुर्भाग्य से यह सभी / पुराने ब्राउज़र द्वारा समर्थित नहीं है।

FormData समर्थन डेस्कटॉप ब्राउज़र संस्करणों के बाद से शुरू होता है।

  • IE 10+
  • फ़ायरफ़ॉक्स 4.0+
  • क्रोम 7+
  • सफारी 5+
  • ओपेरा 12+

अधिक विवरण के लिए, MDN लिंक देखें ।


41
यहाँ उन विशिष्ट ब्राउज़रों की एक सूची दी गई है जो समर्थित नहीं हैं: caniuse.com/#search=FormData इसके अलावा मैंने इसका परीक्षण नहीं किया है, लेकिन यहाँ फॉर्मडटा gist.github.com/3120320 के
रायन व्हाइट

152
विशेष रूप से, IE <10, लिंक पढ़ने के लिए आलसी लोगों के लिए भी नहीं करता है।
केविन

22
@Synexis नहीं हमें उस लंबे समय तक इंतजार नहीं करना पड़ेगा क्योंकि सभी IE में केवल 22% विश्व व्यापी बाजार हिस्सेदारी है और 27% अमेरिका में है और तेजी से गिर रही है। संभावना है कि यह 70 साल से अधिक उम्र के लोग हैं। इसलिए इसके बजाय IE डिक्टेट कर रहा है कि डेवलपर्स को क्या करना है IE को या तो आकार देना होगा या दौड़ से बाहर निकलना होगा।
ड्रू काल्डर

30
@DrewCalder अधिकांश IE उपयोगकर्ता कार्यालय कर्मचारी होते हैं जिनके पास यह विकल्प नहीं होता है कि वे कंपनी की नीतियों के कारण किस ब्राउज़र का उपयोग करें। मुझे नहीं लगता कि उम्र का इससे कोई लेना-देना है। मैं ज्यादातर लोगों का अनुमान लगा रहा हूं> 70 की बजाय क्रोम या एफएफ स्थापित करने के लिए अपनी संतान प्राप्त करें :)
निकोलस कनॉट

3
इस लिंक ने नंगे न्यूनतम को समझने में वास्तव में मेरी मदद की। मुझे xhr अनुरोध का उपयोग नहीं करना पड़ा। आप उपयोग ajax मेकअप करते हैं यकीन है कि स्थापित करने के लिए enctypeकरने के लिए "form/multipart"!
चमकदार

316

आइजैक्स के माध्यम से फाइल अपलोड करने के लिए iframes की आवश्यकता नहीं है। मैंने हाल ही में इसे स्वयं किया है। ये पृष्ठ देखें:

AJAX और jQuery के साथ HTML5 फ़ाइल अपलोड का उपयोग करना

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

उत्तर को अपडेट किया और इसे साफ किया। आकार की जाँच करने के लिए getSize फ़ंक्शन का उपयोग करें या प्रकारों की जाँच करने के लिए getType फ़ंक्शन का उपयोग करें। जोड़ा गया प्रगति पट्टी HTML और सीएसएस कोड।

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

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

3
आप कम या ज्यादा कोड को सीधे कॉपी कर सकते हैं और उसका उपयोग कर सकते हैं। बस कुछ आईडी नाम और वर्ग नाम बदलें। कोई भी अनुकूलन अपने आप पर होता है।
जिऑन लोडर

4
ध्यान दें कि myXhr वैश्विक होने के साथ-साथ नाम, आकार और प्रकार का भी लगता है। साथ ही पहले से बनाए गए XMLHttpRequest ऑब्जेक्ट को बढ़ाने के लिए "xS" का उपयोग करने के बजाय "पहले से भेजें" का उपयोग करना बेहतर है ताकि इसे बदल सकें।
जागृति

8
मुझे नहीं लगता कि हम @Ziinloader का उपयोग कर सकते हैं। आप कुछ स्थानीय विधि का उपयोग कर रहे हैं जो शामिल नहीं हैं writer(catchFile):। क्या है writer()?
tandrewnichols

4
क्या होगा अगर डेटा में अपलोड करने के लिए फ़ाइल के साथ कुछ फ़ील्ड भी हों?
राजू

2
@Ziinloader यह एक जबरदस्त उपयोगी उदाहरण है जिसे मैं देखता हूं कि आप कई बार वापस आ चुके हैं और इसे बनाए रखा है। सच में एक उत्तर देने के लिए एक से अधिक मूल्य जो मैं दे सकता हूं।
नियमित जो

190

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

जैसा कि आप देख सकते हैं, आपको फॉर्मडैट ऑब्जेक्ट बनाना होगा, खाली या (क्रमबद्ध? - $('#yourForm').serialize())मौजूदा फ़ॉर्म, और फिर इनपुट फ़ाइल संलग्न करें।

यहाँ अधिक जानकारी है: - jQuery.ajax और FormData का उपयोग करके फ़ाइल कैसे अपलोड करें - jQuery के माध्यम से फाइल अपलोड करना, ऑब्जेक्ट फॉर्मडाटा प्रदान किया गया है और कोई फ़ाइल नाम नहीं है, 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
इस कोड को चलाने के लिए मुझे किस लाइब्रेरी की आवश्यकता होगी?
रेयान ब्लैक

उत्तर 2014 में लिखा गया था। JQuery का संस्करण 1.10 था। मैंने अधिक हाल के संस्करणों के साथ प्रयास नहीं किया है।
पेड्रोपोपायरेस 19

5
formData.append('file', $('#file')[0].files[0]);रिटर्न undefinedऔर console.log(formData) कुछ नहीं है सिवाय_proto_
याकूब उबैदी

1
IE 9 द्वारा समर्थित नहीं है, अगर मैं I
CountMurphy

3
मुझे यह काम करने के लिए मिला है ... मुझे चुटकी, मैं 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); } });
तारकस ३०'१

104

सिंपल अपलोड फॉर्म

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


महोदय, इस उदाहरण पर जिन js का उपयोग किया गया था, उनमें से एक के लिए एक विशिष्ट jquery प्लगइन है। मेरे पास एक प्रश्न है जो मैंने यहां बताया था कि क्या आप कृपया मेरे प्रश्न की जांच कर सकते हैं .. मैं उस परियोजना में कई फ़ाइल या चित्र अपलोड करना चाहता हूं इसका लिंक है stackoverflow.com/questions/28644200/…
ब्राउनमैन रिवाइवल

19
$ (इस) [0] है इस
machineaddict

2
पोस्ट की गई फ़ाइल के लिए सर्वर पर पैरामीटर क्या है? आप सर्वर हिस्सा पोस्ट कर सकते हैं
FrenkyB

@FrenkyB और अन्य - सर्वर पर फ़ाइलें (PHP में) $ _POST चर में संग्रहीत नहीं हैं - वे $ _FILES चर में संग्रहीत हैं। इस स्थिति में, आप इसे $ _FILES ["सीएसवी"] के साथ एक्सेस करेंगे क्योंकि "सीएसवी" इनपुट टैग का नाम विशेषता है।
dev_masta

68

मुझे इसके लिए बहुत देर हो गई है, लेकिन मैं एक अजाक्स आधारित छवि अपलोड करने वाले समाधान की तलाश में था और मैं जिस उत्तर की तलाश कर रहा था, वह इस पोस्ट में बिखरा हुआ था। समाधान मैंने 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 में प्रदर्शित कस्टम फ़ील्ड दोनों का उपयोग करना शामिल है।

Upload.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";
}
?>

मुझे लग रहा है Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,कि ऐसा क्यों है सर मैं अपने कोड को कॉपी पेस्ट करता हूं जैसे कि यह है
ब्राउनमैन रिवाइवल

2
@HogRider - यदि आप Google को अपना त्रुटि संदेश देते हैं, तो यह पहला परिणाम है: stackoverflow.com/questions/10752055/… क्या आप file://वेब सर्वर का उपयोग करने के बजाय स्थानीय वेब पेजों के माध्यम से प्रवेश कर रहे हैं? एक तरफ के रूप में, इसे समझने के बिना केवल आँख बंद करके कोड-पेस्ट करना सबसे अच्छा अभ्यास नहीं है। मैं आपको कोड लाइन-बाय-लाइन के माध्यम से जाने की सलाह दूंगा कि कोड को उपयोग करने से पहले क्या हो रहा है।
कोलिनसिमरन

@colincameron कुछ चीजों को स्पष्ट करने के लिए धन्यवाद, मैंने इसे लाइन के माध्यम से जाना था और मैं वास्तव में बहुत कुछ नहीं समझता हूं इसलिए मैंने सवाल पूछा ताकि कोई मेरे संदेह को स्पष्ट कर सके। मैं सटीक होने के लिए स्थानीय तरीके से xampp का उपयोग कर रहा हूं। क्या मैं एक सवाल पूछ सकता हूं जो शायद आप स्पष्ट कर सकते हैं?
ब्राउनमैन रिवाइवल

@Brownman रिवाइवल: मुझे पता है कि इसके उत्तर के लिए बहुत देर हो चुकी है .. आपको एक क्रॉस ओरिजिनल त्रुटि मिली क्योंकि आपने html फाइल को सर्वर से चलाने के बजाय फाइल के रूप में खोला है।
आदर्श मोहन

@ AdarshMohan i ने उत्तर को स्पष्ट किया कि आप कैसे सुझाव देते हैं कि मैं इसे सही करूं?
ब्राउनमैन पुनरुद्धार

31

एक AJAX अपलोड वास्तव में संभव है XMLHttpRequest()। कोई iframes आवश्यक नहीं अपलोड प्रगति दिखाई जा सकती है।

विवरण के लिए देखें: jQuery अपलोड प्रगति और AJAX फ़ाइल अपलोड करने के लिए https://stackoverflow.com/a/4943774/873282 उत्तर दें ।


24
दुर्भाग्य से IE <10 यह समर्थन नहीं करते।
साशा चोडगोव

1
जब आप उत्तर के रूप में किसी अन्य पृष्ठ को संदर्भित करना चाहते हैं, तो आप किसी प्रश्न के तहत किसी टिप्पणी के रूप में बंद कर सकते हैं या टिप्पणी छोड़ सकते हैं। यह पोस्ट एक उत्तर नहीं है। इस तरह का एक पोस्ट रेप करने की कोशिश की तरह दिखता है।
मिकमैकुसा

18

यहां बताया गया है कि मुझे यह काम कैसे मिला:

एचटीएमएल

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

जे एस

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

पीएचपी

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


    // process your file

}

2
इस बारे में मेरे लिए जो सबसे ज्यादा मददगार था, वह था $('#file')[0].files[0]जेएस के कुछ प्रकार की बिना किसी आवश्यकता के अजीब जेएस वर्कअराउंड<form>
ffgpga08

यह पूर्ण समाधान है, PHP बिट भी मदद करता है।
cdsaenz

14

मामले में आप इसे इस तरह करना चाहते हैं:

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

आपका समाधान हो सकता है।


$ ऑब्जेक्ट में अपलोड विधि कहां है, उपरोक्त लिंक मौजूदा नहीं है
शीतलन


2
अपना उत्तर पोस्ट करने के लिए धन्यवाद! कृपया सेल्फ-प्रमोशन पर अक्सर पूछे जाने वाले प्रश्नों को ध्यान से पढ़ें । यह भी ध्यान दें कि यह आवश्यक है कि आप हर बार जब आप अपनी साइट / उत्पाद से लिंक करें तो एक अस्वीकरण पोस्ट करें।
एंड्रयू बार्बर

13
  • एक छिपे हुए iframe का उपयोग करें और अपने फॉर्म के लक्ष्य को उस iframe के नाम पर सेट करें। इस तरह, जब फॉर्म जमा किया जाता है, केवल iframe ताज़ा किया जाएगा।
  • प्रतिक्रिया को पार्स करने के लिए iframe के लोड इवेंट के लिए एक ईवेंट हैंडलर पंजीकृत करें।

: मेरे ब्लॉग पोस्ट पर अधिक जानकारी http://blog.manki.in/2011/08/ajax-fie-upload.html


यदि संभव हो तो आइफ्रेम से बचें
भार्गव नेनकलेवा

@BhargavNanekalva आपकी चिंता क्या है?
aswzen

13
$("#submit_car").click( function() {
  var formData = new FormData($('#car_cost_form')[0]);
$.ajax({
       url: 'car_costs.php',
       data: formData,
       async: false,
       contentType: false,
       processData: false,
       cache: false,
       type: 'POST',
       success: function(data)
       {
       },
     })    return false;    
});

संपादित करें: सामग्री को नोट करें और डेटा को संसाधित करें। आप इसका उपयोग केवल Ajax के माध्यम से फ़ाइलों को अपलोड करने के लिए कर सकते हैं ...... सबमिट करें इनपुट फार्म तत्व के बाहर नहीं हो सकता है :)


3
इस पद्धति का उपयोग करके, आप फ़ॉर्म को पोस्ट कर सकते हैं लेकिन 'फ़ाइल' प्रकार फ़ील्ड के साथ नहीं। यह प्रश्न विशेष रूप से फ़ाइल अपलोड के बारे में है।
जोमी जॉन

11

2019 अपडेट:

एचटीएमएल

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

1
पहले से दिए गए किसी भी उत्तर को कैसे सुधारें? इसके अलावा इस जवाब में एक विचार-उन्मुख फ़ाइल का उल्लेख है जो कि Django है और इस प्रश्न से कोई लेना-देना नहीं है।
dirkgroten

6
क्योंकि समस्या Django का उपयोग करते समय स्वयं ही तुलनात्मक रूप से प्रकट होती है, और यदि आप Django का उपयोग कर रहे हैं, तो इसे हल करने के संबंध में यहाँ बहुत दिशा नहीं है। मैंने सोचा था कि मैं भविष्य में किसी के यहां पहुंचने पर ही सक्रिय सहायता की पेशकश करूंगा। किसी न किसी दिन?
Jay

9

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

यह वह है: ('उपयोगकर्ता', $ ('# उपयोगकर्ता')। वैल ());
rahim.nagori

id के साथ टेक्स्टबॉक्स = "उपयोगकर्ता" को फॉर्म @ rahim.nagori से जोड़ा गया है
Alp Altunel

7

मैंने तत्काल पूर्वावलोकन के साथ एक एकाधिक फ़ाइल का चयन किया है और पूर्वावलोकन के बाद अवांछित फ़ाइलों को हटाने के बाद अपलोड करें।

विस्तृत दस्तावेज यहां देखे जा सकते हैं: http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

डेमो: http://jsfiddle.net/anas/6v8Kz/7/embedded/result/

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

जावास्क्रिप्ट:

    $(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;
}

@Bhargav: कृपया स्पष्टीकरण के लिए ब्लॉग पोस्ट देखें: goo.gl/umgFFy । यदि आपके पास अभी भी कोई प्रश्न है, तो मेरे पास वापस
आएँ

7

मैंने इन्हें एक साधारण कोड में संभाला है। आप यहां से एक कार्यशील डेमो डाउनलोड कर सकते हैं

आपके मामले के लिए, ये बहुत संभव हैं। मैं आपको कदम से कदम उठाऊंगा कि कैसे आप AJAX jquery का उपयोग करके सर्वर पर फ़ाइल अपलोड कर सकते हैं।

नीचे दिए गए फॉर्म फ़ाइल तत्व को जोड़ने के लिए पहले हम एक HTML फाइल बनाते हैं।

<form action="" id="formContent" method="post" enctype="multipart/form-data" >
         <input  type="file" name="file"  required id="upload">
         <button class="submitI" >Upload Image</button> 
</form>

दूसरे में jquery.js फ़ाइल बनाएँ और सर्वर पर हमारी फ़ाइल सबमिट करने के लिए निम्नलिखित कोड जोड़ें

    $("#formContent").submit(function(e){
        e.preventDefault();

    var formdata = new FormData(this);

        $.ajax({
            url: "ajax_upload_image.php",
            type: "POST",
            data: formdata,
            mimeTypes:"multipart/form-data",
            contentType: false,
            cache: false,
            processData: false,
            success: function(){
                alert("file successfully submitted");
            },error: function(){
                alert("okey");
            }
         });
      });
    });

वहाँ आप कर रहे हैं। और देखो


7

फॉर्मडाटा का उपयोग करना कई उत्तरों द्वारा संकेत के रूप में जाने का तरीका है। यहाँ कुछ कोड है जो इस उद्देश्य के लिए बहुत अच्छा काम करता है। मैं जटिल परिस्थितियों को पूरा करने के लिए अजाक्स ब्लॉकों के घोंसले बनाने की टिप्पणी से भी सहमत हूं। 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");
        }
    });
});

यह रन थ्रू jquery को मान्य करता है ... if (? fileupload.valid ()) {झूठा वापस; }
माइक वोल्मार

7

शुद्ध जेएस का उपयोग करना आसान है

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

  • सर्वर साइड में आप मूल फ़ाइल नाम (और अन्य जानकारी) पढ़ सकते हैं जो स्वचालित रूप से अनुरोध करने के लिए शामिल है।
  • आपको हेडर "सामग्री-प्रकार" सेट करने की आवश्यकता नहीं है "मल्टीपार्ट / फॉर्म-डेटा" ब्राउज़र इसे स्वचालित रूप से सेट करेगा
  • यह समाधान सभी प्रमुख ब्राउज़रों पर काम करना चाहिए।

यहां एरर हैंडलिंग और अतिरिक्त जसन भेजने के साथ अधिक विकसित स्निपेट है


6

हां, आप फ़ाइल प्राप्त करने के लिए केवल जावास्क्रिप्ट का उपयोग कर सकते हैं, यह सुनिश्चित करते हुए कि आप फ़ाइल को डेटा URL के रूप में पढ़ते हैं। आधार 64 से पहले सामान बाहर पार्स वास्तव में आधार 64 एन्कोडेड डेटा प्राप्त करने के लिए और फिर अगर आप php या वास्तव में किसी भी बैक एंड भाषा का उपयोग कर रहे हैं तो आप बेस 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"]));

बेशक आप शायद कुछ सत्यापन करना चाहते हैं जैसे कि आप किस फ़ाइल प्रकार के साथ काम कर रहे हैं और सामान की तरह है, लेकिन यह विचार है।


file_put_contents ($ fname, file_get_contents ($ _ POST ['डेटा'))); file_get_contents डीकोडिंग और डेटा के साथ काम करता है: // हैडर
नंद

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

आप 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
मेरा मानना ​​है कि आप jquery फॉर्म प्लगइन के बारे में बात कर रहे हैं । आपके उत्तर में विवरण की कमी के अलावा, यह वास्तव में यहां सबसे अच्छा विकल्प है।
फॉटेनस

@fotanus तुम सही हो! उस स्क्रिप्ट को jquery फॉर्म प्लगइन का उपयोग करना चाहिए, उपयोग विधि सबमिट करने के लिए ajaxSubmit जो कि jquery फॉर्म प्लगइन में परिभाषित करता है
Quy Le

4

एक फ़ाइल अपलोड करने के लिए जिसे उपयोगकर्ता द्वारा jquery का उपयोग करके प्रपत्र के एक भाग के रूप में प्रस्तुत किया गया है कृपया नीचे दिए गए कोड का पालन करें:

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

फिर फॉर्म डेटा ऑब्जेक्ट को सर्वर पर भेजें।

हम सीधे फॉर्मडैट ऑब्जेक्ट पर फ़ाइल या ब्लॉब भी जोड़ सकते हैं।

data.append("myfile", myBlob, "filename.txt");

3

यदि आप 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>

3

अपने सभी फॉर्म इनपुट प्राप्त करने के लिए, प्रकार = "फ़ाइल" सहित आपको फॉर्मडैट ऑब्जेक्ट का उपयोग करने की आवश्यकता है । आप डिबगर में फ़ॉर्मडैट सामग्री देख पाएंगे -> नेटवर्क -> हेडर के बाद आप फॉर्म सबमिट करेंगे।

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

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

5
आप कुछ विवरण जोड़कर अपना उत्तर सुधार सकते हैं
SR

1

यहाँ एक विचार था जो मैं सोच रहा था:

Have an iframe on page and have a referencer.

एक प्रपत्र है जिसमें आप INPUT: फ़ाइल तत्व को स्थानांतरित करते हैं।

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

परिणाम फ्रेम पर पोस्ट होगा, और फिर आप बस प्राप्त डेटा को एक स्तर तक भेज सकते हैं, जैसा कि आप चाहते हैं कि छवि टैग कुछ इस तरह है:

data:image/png;base64,asdfasdfasdfasdfa

और पेज लोड होता है।

मेरा मानना ​​है कि यह मेरे लिए काम करता है, और इस आधार पर आप ऐसा कुछ करने में सक्षम हो सकते हैं:

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

मैं यह नहीं देखता कि यह पहले दिए गए किसी अन्य उत्तर को कैसे सुधारता है। इसके अलावा यह प्रचार प्रसार नहीं है! ;)
डूडर्टज जे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.