jQuery Ajax ফাইল আপলোড


755

আমি কি একটি এজ্যাক্স অনুরোধের POST পদ্ধতি ব্যবহার করে ফাইল আপলোড সম্পাদন করতে নীচের jQuery কোডটি ব্যবহার করতে পারি?

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

যদি এটি সম্ভব হয় তবে আমার কি dataঅংশ পূরণ করার দরকার আছে ? এটা কি সঠিক উপায়? আমি কেবল ফাইলটি সার্ভারের পাশেই পোস্ট করি।

আমি প্রায় googling ছিল, কিন্তু আমি যা পেয়েছিলাম তা আমার প্ল্যান করার সময় একটি প্লাগইন ছিল আমি এটি ব্যবহার করতে চাই না। মুহূর্ত জন্য অন্তত।


Ajax ফাইল আপলোড সমর্থন করে না, পরিবর্তে আপনার iframe ব্যবহার করা উচিত
antyrat

1
সম্পর্কিত প্রশ্ন: স্ট্যাকওভারফ্লো.com
নাথান কোপ

উত্তর:


596

এজেএক্সের মাধ্যমে ফাইল আপলোড করা সম্ভব নয়
আপনি পৃষ্ঠাটি রিফ্রেশ না করে, ফাইল আপলোড করতে পারেন IFrame
আপনি এখানে আরও বিশদ পরীক্ষা করতে পারেন ।


হালনাগাদ

এক্সএইচআর 2 দিয়ে, এজেএক্সের মাধ্যমে ফাইল আপলোড সমর্থিত। যেমন FormDataবস্তুর মাধ্যমে , তবে দুর্ভাগ্যক্রমে এটি সমস্ত / পুরানো ব্রাউজারগুলির দ্বারা সমর্থিত নয়।

FormData সমর্থন নিম্নলিখিত ডেস্কটপ ব্রাউজার সংস্করণ থেকে শুরু হয়।

  • IE 10+
  • ফায়ারফক্স 4.0+
  • ক্রোম 7+
  • সাফারি 5+
  • অপেরা 12+

আরও বিশদের জন্য এমডিএন লিঙ্কটি দেখুন


41
সমর্থিত নয় এমন নির্দিষ্ট ব্রাউজারগুলির একটি তালিকা এখানে রয়েছে: ক্যানিউজ :: #search=FormData এছাড়াও আমি এটি পরীক্ষা করিনি তবে এখানে ফর্মডাটা gist.github.com/3120320
রায়ান হোয়াইট

152
বিশেষত, লিঙ্কটি পড়তে খুব অলস তাদের জন্য, আই <10 নেই doesn't
কেভিন

22
@ সাইনেক্স নেই, আমাদের আর দীর্ঘকাল অপেক্ষা করতে হবে না কারণ সমস্ত আইইয়ের কেবলমাত্র বিশ্বব্যাপী ২২% শেয়ার রয়েছে এবং যুক্তরাষ্ট্রে ২ 27% রয়েছে এবং দ্রুত নামছে। সম্ভাবনা হ'ল এটি 70০ বছরের বেশি বয়সী লোক। তারপরে তবে আইই নির্ধারণ করে যে বিকাশকারীদের যা করতে হবে তা হয় হয় গঠন করতে হবে বা রেস থেকে বেরিয়ে আসতে হবে।
ড্রু ক্যাল্ডার

30
@ ড্রু ক্যাল্ডার বেশিরভাগ আইই ব্যবহারকারী তাদের অফিস কর্মী যাঁরা কোম্পানির নীতিমালার কারণে কোন ব্রাউজারে ব্যবহার করবেন তা পছন্দ করেন না। আমার মনে হয় না এর সাথে বয়সের অনেক কিছু আছে। আমি বেশিরভাগ লোকের অনুমান করছি> 70 জন তাদের বংশের পরিবর্তে ক্রোম বা এফএফ ইনস্টল করুন :)
নিকোলাস কননাউল্ট

3
এই লিঙ্কটি সত্যিকার অর্থে ন্যূনতম বুঝতে সাহায্য করেছে understanding আমাকে এক্সএইচআর অনুরোধ ব্যবহার করতে হবে না। আপনি যদি এজ্যাক্স ব্যবহার করেন তবে সেটিংসটি নিশ্চিত করে enctypeনিন "form/multipart"!
আলোকিত

316

এজ্যাক্সের মাধ্যমে ফাইলগুলি আপলোড করার জন্য আর আইফ্রেমেসের প্রয়োজন নেই। আমি সম্প্রতি এটি নিজের দ্বারা সম্পন্ন করেছি। এই পৃষ্ঠাগুলি দেখুন:

AJAX এবং jQuery এর সাথে HTML5 ফাইল আপলোড ব্যবহার করা

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

উত্তরটি আপডেট করে এটিকে পরিষ্কার করুন। আকার চেক করতে getSize ফাংশন ব্যবহার করুন বা প্রকারগুলি পরীক্ষা করতে getType ফাংশন ব্যবহার করুন। প্রগতিবার এইচটিএমএল এবং সিএসএস কোড যুক্ত হয়েছে।

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

প্রগতিবার এইচটিএমএল কোড

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

প্রগতিবার সিএসএস কোড

#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 অবজেক্টটিকে তৈরি করার জন্য "xhr" ব্যবহার না করে এটি পরিবর্তন করার পরিবর্তে "বিফারসেন্ড" ব্যবহার করা ভাল।
awatts

8
আমি মনে করি না যে আমরা @ জিনলোডার হিসাবে এটি ব্যবহার করতে পারি। আপনি কিছু স্থানীয় পদ্ধতি যা অন্তর্ভুক্ত করা হয়নি ব্যবহার করছেন: writer(catchFile)। কী writer()?
tandrewnichols

4
যদি ডেটাতে আপলোড করার জন্য ফাইলের সাথে কয়েকটি ক্ষেত্রও থাকে?
রাজ্জু

2
@ জিনলোডার এটি একটি দুর্দান্ত উপকারী উদাহরণ যা আমি দেখতে পাচ্ছি আপনি বেশ কয়েকবার ফিরে এসেছেন এবং রক্ষণাবেক্ষণ করেছেন। সত্য যে কোনও উত্তর আমি দিতে পারছি তার চেয়ে অনেক বেশি মূল্য।
নিয়মিত জো

190

অ্যাজাক্স পোস্ট এবং ফাইল আপলোড করা সম্ভব। আমি 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);
       }
});

আপনি দেখতে পাচ্ছেন, আপনাকে অবশ্যই একটি ফর্মডাটা অবজেক্ট তৈরি করতে হবে, খালি বা থেকে (সিরিয়ালযুক্ত? - $('#yourForm').serialize()) বিদ্যমান ফর্ম) থেকে এবং তারপরে ইনপুট ফাইল সংযুক্ত করুন attach

এখানে আরও তথ্য: - jQuery.ajax এবং ফর্মডাটা ব্যবহার করে কোনও ফাইল কীভাবে আপলোড করবেন - ফাইল আপলোড jQuery, অবজেক্ট ফর্মডাটা দিয়ে ফাইল আপলোড করা হবে এবং কোনও ফাইলের নাম নেই, অনুরোধ করুন

পিএইচপি প্রক্রিয়াটির জন্য আপনি এরকম কিছু ব্যবহার করতে পারেন:

//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
এই কোডটি চালানোর জন্য আমার কী jquery গ্রন্থাগারটি উল্লেখ করতে হবে?
রায়ডেন ব্ল্যাক

উত্তরটি 2014 সালে লেখা হয়েছিল। JQuery এর সংস্করণটি ছিল 1.10। আমি আরও সাম্প্রতিক সংস্করণ দিয়ে চেষ্টা করিনি।
পেডরোজপায়ারেস

5
formData.append('file', $('#file')[0].files[0]);ফিরে আসে undefinedএবং console.log(formData) ব্যতীত কিছুই নেই_proto_
ইয়াকব উবাইদি

1
আইই 9 দ্বারা সমর্থিত নয়, যদি কেউ আমার মতো একই জাহান্নামে আটকে থাকে
কাউন্টমারফি 10'17

3
আমি এটি কাজ করতে পেরেছি ... আমাকে চিমটি দিন, আমি jQuery এজ্যাক্স ফাইল আপডে স্বর্গ! 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>


স্যার এই উদাহরণস্বরূপ যে জেএস ব্যবহার করা হয়েছিল তা এখানে একটি নির্দিষ্ট জেকারি প্লাগইন রয়েছে..আমি একটি প্রশ্ন করেছি আমাকে এখানে নির্দেশ করা হয়েছিল আপনি দয়া করে আমার প্রশ্নটি পরীক্ষা করতে পারেন .. আমি এখানে প্রকল্পের একাধিক ফাইল বা চিত্র আপলোড করতে চাই লিঙ্ক stackoverflow.com/questions/28644200/...
Brownman রিভাইভাল

19
$ (এই) [0] হয় এই
machineaddict

2
পোস্ট করা ফাইলের জন্য সার্ভারের প্যারামিটারটি কী? আপনি দয়া করে সার্ভার অংশ পোস্ট করতে পারেন।
ফ্রেনকিবি

@ ফ্রেঙ্কিবি এবং অন্যরা - সার্ভারে থাকা ফাইলগুলি (পিএইচপি-তে) $ _POST ভেরিয়েবলে সংরক্ষণ করা হয় না - সেগুলি $ _FILES ভেরিয়েবলে সংরক্ষণ করা হয়। এই ক্ষেত্রে, আপনি এটি $ _FILES ["csv"] দিয়ে অ্যাক্সেস করতে পারবেন কারণ "csv" ইনপুট ট্যাগের নাম বৈশিষ্ট্য।
dev_masta

68

আমি এর জন্য বেশ দেরি করেছি তবে আমি একটি এজাক্স ভিত্তিক চিত্র আপলোড সমাধানের সন্ধান করছিলাম এবং আমি যে উত্তরটি খুঁজছিলাম তা এই পোস্ট জুড়ে ছড়িয়ে ছিটিয়ে ছিল। সমাধানটি আমি ফর্মডাটা অবজেক্টের সাথে জড়িত। আমি যে কোডটি রেখেছি তার একটি প্রাথমিক ফর্মটি আমি একত্রিত করেছি bled আপনি fd.append () এর সাহায্যে ফর্মটিতে একটি কাস্টম ক্ষেত্র যুক্ত করার পাশাপাশি এজাক্সের অনুরোধটি সম্পন্ন করার সময় প্রতিক্রিয়া ডেটা কীভাবে পরিচালনা করবেন তা এটি দেখায়।

এইচটিএমএল আপলোড করুন:

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

আপনি যদি পিএইচপি এর সাথে কাজ করছেন তবে আপলোড পরিচালনা করার জন্য এখানে একটি উপায় রয়েছে যা উপরের এইচটিএমএলে প্রদর্শিত উভয় কাস্টম ক্ষেত্রের ব্যবহার অন্তর্ভুক্ত করে।

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
@ হোগ্রাইডার - আপনি যদি নিজের ত্রুটি বার্তাটি গুগল করেন তবে এটিই প্রথম ফলাফল: stackoverflow.com/questions/10752055/… আপনি কি file://ওয়েব সার্ভার ব্যবহার না করে স্থানীয়ভাবে আপনার ওয়েব পৃষ্ঠাগুলি অ্যাক্সেস করছেন? একদিকে যেমন, প্রথমে কোডটি না বুঝে অনুলিপি করে অনুলিপি করে অনুলিপি করা ভাল অনুশীলন নয়। কোডটি ব্যবহারের আগে রাখার আগে কী হচ্ছে তা বোঝার জন্য আমি আপনাকে কোড লাইন বাই লাইনে যাওয়ার পরামর্শ দেব।
কলিঙ্কামেরন

@ কলিংক্যামেরন আপনাকে লাইন দিয়ে এই লাইনে যে কয়েকটি জিনিস দিয়েছিল তা স্পষ্ট করার জন্য আপনাকে ধন্যবাদ জানায় এবং আমি সত্যিই এতটা বুঝতে পারি না তাই আমি প্রশ্নটি জিজ্ঞাসা করেছি যাতে কেউ আমার সন্দেহগুলি পরিষ্কার করে দিতে পারে। আমি সঠিকভাবে xampp স্থানীয়ভাবে ব্যবহার করছি। আমি কি এমন প্রশ্ন জিজ্ঞাসা করতে পারি যা সম্ভবত আপনি পরিষ্কার করতে পারেন?
ব্রাউনম্যান পুনর্জীবন

@ ব্রাউনম্যান রিভাইভাল: আমি জানি যে উত্তরের জন্য খুব দেরি হয়ে গেছে .. আপনি একটি ক্রস অরিজিন ত্রুটি পেয়েছেন কারণ আপনি এইচটিএমএল ফাইলটি সার্ভার থেকে চালানোর চেয়ে ফাইল হিসাবে খোলেন।
আদর্শ মোহন

@ আদর্শমোহন আমি জবাবটি অপহরণ করছি আপনি কীভাবে পরামর্শ দিচ্ছেন যে এটি ঠিক করার জন্য আমি এটি করেছি?
ব্রাউনম্যান পুনর্জীবন

31

একটি AJAX আপলোড সত্যিই সম্ভব XMLHttpRequest() । কোন iframes প্রয়োজন। আপলোড অগ্রগতি দেখানো যেতে পারে।

বিশদগুলির জন্য দেখুন: jQuery আপলোড অগ্রগতি এবং AJAX ফাইল আপলোড প্রশ্নে https://stackoverflow.com/a/4943774/873282 উত্তর দিন ।


24
দুর্ভাগ্যক্রমে আইই <10 এটি সমর্থন করে না।
শাশা চেদিগোভ

1
যখন আপনি কেবল উত্তর হিসাবে অন্য পৃষ্ঠায় উল্লেখ করতে চান, আপনি ডুপকুয়েট হিসাবে বন্ধ করতে বা প্রশ্নের অধীনে একটি মন্তব্য করতে ভোট দিতে পারেন। এই পোস্টটি একটি উত্তর নয়। এই ধরণের একটি পোস্ট দেখে মনে হচ্ছে খামার করার চেষ্টা।
মিকম্যাকুসা

17

আমি এই কাজটি কীভাবে পেয়েছি তা এখানে:

এইচটিএমএল

<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>
জেএসের

এটি সম্পূর্ণ সমাধান, পিএইচপি বিটটিও সহায়তা করে।
সিডিএসেনজ

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


যেখানে সম্ভব
ইফ্রেমগুলি

@ ভরগাভনেকালভা আপনার উদ্বেগ কি?
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;    
});

সম্পাদনা করুন: কন্টেন্ট টাইপ এবং প্রক্রিয়া ডেটা নোট করুন আপনি এজ্যাক্সের মাধ্যমে ফাইলগুলি আপলোড করতে কেবল এটি ব্যবহার করতে পারেন ...... জমা দেওয়া ইনপুট ফর্ম উপাদানটির বাইরে হতে পারে না :)


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
ইতিমধ্যে প্রদত্ত যে কোনও উত্তরটি কীভাবে উন্নতি করবে? এছাড়াও এই উত্তরে একটি ভিউ.পি ফাইলের উল্লেখ রয়েছে যা জ্যাঙ্গো এবং এই প্রশ্নের সাথে কোনও সম্পর্ক নেই।
dirkgroten

6
কারণ জ্যাঙ্গো ব্যবহার করার সময় সমস্যাটি তুলনামূলকভাবে প্রকাশ পায় এবং আপনি যদি জ্যাঙ্গো ব্যবহার করছেন তবে এটি সমাধান করার ক্ষেত্রে এখানে খুব বেশি দিকনির্দেশ নেই। আমি ভেবেছিলাম যে ভবিষ্যতে আমি যেমন এখানে এসেছি ঠিক তেমন কেউ এখানে এলে আমি প্রো-সক্রিয় সহায়তার প্রস্তাব দেব। মোটামুটি দিন কাটছে?
জে

9

ফর্মডেটা ব্যবহার করুন। এটি সত্যই ভাল কাজ করে :-) ...

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

এটি যা: ('ব্যবহারকারী', $ ('# ব্যবহারকারী')। ভাল ());
রহিম.নাগোরি

আইডি = "ব্যবহারকারী" সহ পাঠ্যবক্সটি @ রহিম.নাগরি
আল্প আল্টুনেল

7

আমি তাত্ক্ষণিক পূর্বরূপ সহ একাধিক ফাইল নির্বাচন বাস্তবায়িত করেছি এবং এজ্যাক্সের মাধ্যমে প্রাকদর্শন থেকে অযাচিত ফাইলগুলি সরিয়ে নেওয়ার পরে আপলোড করব।

বিস্তারিত ডকুমেন্টেশন এখানে পাওয়া যাবে: http://anasthecoder.blogspot.ae/2014/12/m Multi-file-select-preview-without.html

ডেমো: http://jsfiddle.net/anas/6v8Kz/7/ এম্বেডড রিসাল্ট /

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

@ ভরগাভ: দয়া করে ব্যাখ্যার জন্য ব্লগ পোস্টটি দেখুন: goo.gl/umgFFy । আপনার যদি এখনও কোনও প্রশ্ন থাকে তবে আমার কাছে ফিরে আসুন ধন্যবাদ
ইমা

7

আমি এগুলি একটি সাধারণ কোডে পরিচালনা করেছি। আপনি এখান থেকে একটি ওয়ার্কিং ডেমো ডাউনলোড করতে পারেন

আপনার ক্ষেত্রে, এটি খুব সম্ভব। আমি আপনাকে ধাপে ধাপে নিয়ে যাব আপনি কীভাবে এজেএক্স জ্যাকোয়ারি ব্যবহার করে সার্ভারে কোনও ফাইল আপলোড করতে পারেন।

প্রথমে নীচের মত নীচের ফর্ম ফাইল উপাদান যুক্ত করতে একটি 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 যাচাইকরণের মাধ্যমে ফর্মটি চালায় ... যদি (! ফাইলআপলোড.অডিয়ালি ()) false মিথ্যা ফিরে আসে; }
মাইক ভোলমার

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৪ এর আগে স্টাফগুলি পার্স করুন এবং তারপরে আপনি যদি পিএইচপি বা সত্যিকার অর্থে কোনও ব্যাক এন্ড ল্যাঙ্গুয়েজ ব্যবহার করছেন তবে আপনি বেস data৪ ডেটা ডিকোড করতে পারেন এবং নীচে দেখানো মত একটি ফাইলে সংরক্ষণ করতে পারেন

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

অবশ্যই আপনি কোন বৈধতা যাচাই করতে চাইবেন যেমন আপনি কোন ফাইল টাইপের সাথে কাজ করছেন এবং এটির মতো স্টাফ যাচাই করা যায় তবে এই ধারণাটি।


ফাইল_পুট_কন্টেন্টস (name নাম, ফাইল_জেট_কন্টেন্টস ($ _ পোষ্ট ['ডেটা'])); পাঠোদ্ধারতা এবং ডেটার সঙ্গে file_get_contents পুলিশ: // হেডার
Nande,

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

আপনি অনুসরণ হিসাবে পদ্ধতি আজাক্স সাবমিট ব্যবহার করতে পারেন :) আপনি যখন সার্ভারে আপলোড প্রয়োজন এমন একটি ফাইল নির্বাচন করেন, ফর্মটি সার্ভারে জমা দিন :)

$(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 ফর্ম প্লাগইন ব্যবহার করতে হবে jquery ফর্ম প্লাগইন মধ্যে সংজ্ঞায়িত যে ব্যবহার পদ্ধতি আজাক্স সাবমিট জমা দিতে
Quy Le

4

jquery ব্যবহার করে ফর্মের অংশ হিসাবে ব্যবহারকারী দ্বারা জমা দেওয়া একটি ফাইল আপলোড করতে দয়া করে নীচের কোডটি অনুসরণ করুন:

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

তারপরে সার্ভারে ফর্ম ডেটা অবজেক্টটি প্রেরণ করুন।

আমরা সরাসরি ফর্মডাটা অবজেক্টে ফাইল বা ব্লব যুক্ত করতে পারি।

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

3

আপনি যদি এজেএক্স ব্যবহার করে ফাইল আপলোড করতে চান তবে কোড কোড যা আপনি ফাইল আপলোডের জন্য ব্যবহার করতে পারেন।

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

ফাইল আপলোড করার জন্য এইচটিএমএল এখানে রয়েছে

<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
আপনি কিছু বিশদ যুক্ত করে আপনার উত্তরটি উন্নত করতে পারেন
এসআর

1

এখানে আমি ভাবছিলাম এমন একটি ধারণা ছিল:

Have an iframe on page and have a referencer.

একটি ফর্ম রয়েছে যাতে আপনি ইনপুট: ফাইল উপাদানটিতে স্থানান্তরিত করেন।

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

আমি দেখতে পাই না যে এটি আগে দেওয়া অন্য কোনও উত্তরকে কীভাবে উন্নত করে। এছাড়াও এটি প্রচার নয়! ;)
জেডুয়ার্টেডিজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.