JQuery.ajax এর সাথে মাল্টিপার্ট / ফর্মডাটা প্রেরণ


563

JQuery এর এজাক্স-ফাংশন ব্যবহার করে সার্ভারসাইড পিএইচপি-স্ক্রিপ্টে একটি ফাইল প্রেরণে আমার সমস্যা হয়েছে। এর সাথে ফাইল-তালিকা $('#fileinput').attr('files')পাওয়া সম্ভব তবে সার্ভারে এই ডেটা পাঠানো কীভাবে সম্ভব? ফাইল-ইনপুট ব্যবহার করার সময় $_POSTসার্ভারসাইড পিএইচপি-স্ক্রিপ্টে ফলাফল অ্যারে ( ) 0 ( NULL) হয়।

আমি জানি এটি সম্ভব (যদিও আমি এখনও অবধি কোনও jQuery সমাধান খুঁজে পাইনি, কেবলমাত্র প্রোটোটাই কোড ( http://webreflection.blogspot.com/2009/03/safari-4- একাধিক- আপলোড-with-progress.html ) )।

এটি তুলনামূলকভাবে নতুন বলে মনে হচ্ছে, তাই দয়া করে XHR / Ajax এর মাধ্যমে ফাইল আপলোড অসম্ভব বলে মনে করবেন না, কারণ এটি অবশ্যই কাজ করছে।

আমার সাফারি 5 তে কার্যকারিতাটি দরকার, এফএফ এবং ক্রোমটি সুন্দর হবে তবে এটি অপরিহার্য নয়।

আপাতত আমার কোডটি হ'ল:

$.ajax({
    url: 'php/upload.php',
    data: $('#file').attr('files'),
    cache: false,
    contentType: 'multipart/form-data',
    processData: false,
    type: 'POST',
    success: function(data){
        alert(data);
    }
});

দুর্ভাগ্যক্রমে ফর্মডাটা অবজেক্টটি আইই <10 তে কাজ করে না।
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

@ গার্সিয়া ওয়েবেডিভ ধারণা করছেন আপনি একই এপিআই সমর্থন করতে ফ্ল্যাশ সহ একটি পলিফিল ব্যবহার করতে পারেন। পরীক্ষা করে দেখুন github.com/Modernizr/Modernizr/wiki/... আরও তথ্যের জন্য।
yuxhuang


3
আপনি $(':file')সমস্ত ইনপুট ফাইল নির্বাচন করতে ব্যবহার করতে পারেন । এটি কিছুটা সহজ।
শাহার

@ রামেশ্বরভিয়েভরে এই প্রশ্নের উত্তর দেওয়া হয়েছিল এই প্রশ্নের উত্তর দেওয়ার পাঁচ বছর পরে। আপনার নিজের উত্তর প্রচার করতে দয়া করে অনুরূপ প্রশ্নগুলি ট্রোল করবেন না।
রায়ান পি

উত্তর:


882

সাফারি 5 / ফায়ারফক্স 4 দিয়ে শুরু করে, FormDataক্লাসটি ব্যবহার করা সবচেয়ে সহজ :

var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) {
    data.append('file-'+i, file);
});

সুতরাং এখন আপনার একটি FormDataঅবজেক্ট রয়েছে, এক্সএমএলএইচটিপিআরকোয়েস্ট সহ প্রেরণে প্রস্তুত।

jQuery.ajax({
    url: 'php/upload.php',
    data: data,
    cache: false,
    contentType: false,
    processData: false,
    method: 'POST',
    type: 'POST', // For jQuery < 1.9
    success: function(data){
        alert(data);
    }
});

এটি জরুরী যে আপনি contentTypeবিকল্পটি সেট করেছেন false, jQuery আপনার জন্য একটি Content-Typeশিরোনাম যোগ না করার জন্য বাধ্য করুন , অন্যথায়, সীমানা স্ট্রিংটি এটি থেকে হারিয়ে যাবে। এছাড়াও, আপনাকে অবশ্যই processDataপতাকাটিকে মিথ্যা হিসাবে সেট করতে হবে, অন্যথায়, jQuery আপনাকে FormDataএকটি স্ট্রিংয়ে রূপান্তরিত করার চেষ্টা করবে , যা ব্যর্থ হবে।

আপনি এখন পিএইচপি-তে ফাইলটি পুনরুদ্ধার করতে পারেন:

$_FILES['file-0']

(কেবলমাত্র একটি ফাইল রয়েছে, file-0যদি না আপনি multipleনিজের ফাইল ইনপুটটিতে অ্যাট্রিবিউটটি নির্দিষ্ট করেন, তবে এক্ষেত্রে প্রতিটি ফাইলের সাথে সংখ্যাগুলি বাড়বে))

ব্যবহার FormData এমুলেশন পুরোনো ব্রাউজারের জন্য

var opts = {
    url: 'php/upload.php',
    data: data,
    cache: false,
    contentType: false,
    processData: false,
    method: 'POST',
    type: 'POST', // For jQuery < 1.9
    success: function(data){
        alert(data);
    }
};
if(data.fake) {
    // Make sure no text encoding stuff is done by xhr
    opts.xhr = function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.send = xhr.sendAsBinary; return xhr; }
    opts.contentType = "multipart/form-data; boundary="+data.boundary;
    opts.data = data.toString();
}
jQuery.ajax(opts);

একটি বিদ্যমান ফর্ম থেকে ফর্মডেটা তৈরি করুন

ম্যানুয়ালি ফাইলগুলি পুনরাবৃত্তি করার পরিবর্তে ফর্মডাটা অবজেক্টটি বিদ্যমান ফর্ম অবজেক্টের সামগ্রী সহ তৈরি করা যেতে পারে:

var data = new FormData(jQuery('form')[0]);

কাউন্টারের পরিবর্তে পিএইচপি নেটিভ অ্যারে ব্যবহার করুন

কেবল আপনার ফাইল উপাদানগুলির নাম দিন এবং বন্ধনীতে নামটি শেষ করুন:

jQuery.each(jQuery('#file')[0].files, function(i, file) {
    data.append('file[]', file);
});

$_FILES['file']তারপরে আপলোড হওয়া প্রতিটি ফাইলের জন্য ফাইল আপলোড ক্ষেত্র সমন্বিত একটি অ্যারে হবে। আমি এটির পুনরুক্তি করা সহজতর হিসাবে এটি আমার প্রাথমিক সমাধানের উপরে এটির প্রস্তাব দিই।


2
এছাড়াও, এখানে একটি ফর্মডাটা এমুলেশন রয়েছে যা পুরানো ব্রাউজারগুলিতে এই সমাধানটি পোর্টিংকে সহজ করে তুলবে । আপনাকে যা যা করতে হবে তা হল সম্পত্তিটি ম্যানুয়ালি data.fakeসেট করার contentTypeপাশাপাশি ব্যবহার করতে এক্সএইচআর ওভাররাইডিংয়ের জন্য sendAsBinary()
রাফেল শোয়েকার্ট

13
আপনি তন্ন তন্ন ব্যবহার তাই করছি jQueryনা FormDataবর্গ এবং আপনি আমাকে jQuery এর একটি প্রশ্ন নির্দিষ্ট এবং FormData ব্যবহার একটি উত্তর নির্দিষ্ট প্রেক্ষাপটে বলছি? আমি দুঃখিত, তবে আমি মনে করি না যে আমি আপনাকে সেখানে সাহায্য করতে পারি ...
রাফেল শোয়েকার্ট

3
এটি ব্যবহার করে application/x-www-form-urlencodedmultipart/form-dataপরিবর্তে কোন উপায় আছে ?
টিএমএমএম

4
@ টিম্মম্ম না, এটি ব্যবহার করে multipart/form-data। ব্যবহার করা কার্যকর application/x-www-form-urlencodedহবে না।
রাফেল শোয়েকার্ট

5
@RoyiNamir এটা শুধুমাত্র নথিভুক্ত হচ্ছে কোডে , আমি ভয় করছি।
রাফেল শোয়েকার্ট

51

রাফেলের দুর্দান্ত উত্তরে কিছুটা যুক্ত করতে চেয়েছি। আপনি কীভাবে $_FILESজাভাস্ক্রিপ্ট জমা দেওয়ার জন্য ব্যবহার করছেন তা বিবেচনা না করেই পিএইচপি কীভাবে এটি উত্পাদন করতে যায় তা এখানে।

এইচটিএমএল ফর্ম:

<form enctype="multipart/form-data" action="/test.php" 
method="post" class="putImages">
   <input name="media[]" type="file" multiple/>
   <input class="button" type="submit" alt="Upload" value="Upload" />
</form>

পিএইচপি $_FILESএটি যখন জাভাস্ক্রিপ্ট ছাড়াই জমা দেয়:

Array
(
    [media] => Array
        (
            [name] => Array
                (
                    [0] => Galata_Tower.jpg
                    [1] => 518f.jpg
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => /tmp/phpIQaOYo
                    [1] => /tmp/phpJQaOYo
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                )

            [size] => Array
                (
                    [0] => 258004
                    [1] => 127884
                )

        )

)

আপনি যদি প্রগতিশীল বর্ধন করেন, ফাইলগুলি জমা দেওয়ার জন্য রাফেলের জেএস ব্যবহার করে ...

var data = new FormData($('input[name^="media"]'));     
jQuery.each($('input[name^="media"]')[0].files, function(i, file) {
    data.append(i, file);
});

$.ajax({
    type: ppiFormMethod,
    data: data,
    url: ppiFormActionURL,
    cache: false,
    contentType: false,
    processData: false,
    success: function(data){
        alert(data);
    }
});

... $_FILESএটি জাভাস্ক্রিপ্ট জমা দেওয়ার জন্য ব্যবহারের পরে পিএইচপি-র অ্যারে দেখতে এমন দেখাচ্ছে:

Array
(
    [0] => Array
        (
            [name] => Galata_Tower.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpAQaOYo
            [error] => 0
            [size] => 258004
        )

    [1] => Array
        (
            [name] => 518f.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpBQaOYo
            [error] => 0
            [size] => 127884
        )

)

এটি একটি দুর্দান্ত অ্যারে, এবং আসলে কিছু লোক যা রূপান্তরিত $_FILESকরে, তবে $_FILESজাভাস্ক্রিপ্ট জমা দেওয়ার জন্য ব্যবহার না করেই আমি এটির সাথে কাজ করা দরকারী বলে মনে করি । সুতরাং, এখানে জেএসে কিছু ছোটখাটো পরিবর্তন করা হয়েছে:

// match anything not a [ or ]
regexp = /^[^[\]]+/;
var fileInput = $('.putImages input[type="file"]');
var fileInputName = regexp.exec( fileInput.attr('name') );

// make files available
var data = new FormData();
jQuery.each($(fileInput)[0].files, function(i, file) {
    data.append(fileInputName+'['+i+']', file);
});

(14 এপ্রিল 2017 সম্পাদনা করুন: আমি ফর্মডাটা () এর কনস্ট্রাক্টর থেকে ফর্ম উপাদানটি সরিয়েছি - যা সাফারিতে এই কোডটি স্থির করেছে))

কোডটি দুটি কাজ করে।

  1. inputএইচটিএমএলকে আরও রক্ষণাবেক্ষণযোগ্য করে তুলতে স্বয়ংক্রিয়ভাবে নামটির বৈশিষ্ট্য পুনরুদ্ধার করে । এখন, যতক্ষণ formক্লাস পুটআইমেজ রয়েছে, সমস্ত কিছু স্বয়ংক্রিয়ভাবে যত্ন নেওয়া হবে। অর্থাৎ inputপ্রয়োজনের কোনও বিশেষ নাম থাকার দরকার নেই।
  2. সাধারণ এইচটিএমএল জমা দেয় এমন অ্যারে ফর্ম্যাটটি জাভাস্ক্রিপ্ট দ্বারা ডেটা.অ্যাপেন্ড লাইনে পুনরায় তৈরি করা হয়। বন্ধনী নোট করুন।

এই পরিবর্তনগুলির সাথে, জাভাস্ক্রিপ্টের সাথে জমা দেওয়া এখন $_FILESসাধারণ HTML এর সাথে জমা দেওয়ার মতো ঠিক একই অ্যারে তৈরি করে ।


সাফারি নিয়েও একই সমস্যা ছিল। ইঙ্গিতটির জন্য ধন্যবাদ!
মেডোয়েথিংস

49

আমার কোড দেখুন, এটি আমার জন্য কাজ করে

$( '#formId' )
  .submit( function( e ) {
    $.ajax( {
      url: 'FormSubmitUrl',
      type: 'POST',
      data: new FormData( this ),
      processData: false,
      contentType: false
    } );
    e.preventDefault();
  } );

এটি পুরোপুরি কাজ করেছে এবং এটি প্রয়োগ করা খুব সহজ।
Jh62

45

আমি সন্ধান করা কিছু তথ্যের ভিত্তিতে এই ফাংশনটি তৈরি করেছি built

এটি ব্যবহার করার মতো ব্যবহার করুন .serialize(), পরিবর্তে কেবল রাখুন .serializefiles();
আমার পরীক্ষা এখানে কাজ।

//USAGE: $("#form").serializefiles();
(function($) {
$.fn.serializefiles = function() {
    var obj = $(this);
    /* ADD FILE TO PARAM AJAX */
    var formData = new FormData();
    $.each($(obj).find("input[type='file']"), function(i, tag) {
        $.each($(tag)[0].files, function(i, file) {
            formData.append(tag.name, file);
        });
    });
    var params = $(obj).serializeArray();
    $.each(params, function (i, val) {
        formData.append(val.name, val.value);
    });
    return formData;
};
})(jQuery);

2
আমি এই কাজটি করার চেষ্টা করছিলাম, তবে পৃষ্ঠার শীর্ষে এই সংজ্ঞা থাকা সত্ত্বেও সিরিয়ালজাইফাইলস () কে একটি ফাংশন হিসাবে স্বীকৃতি দেবে না বলে মনে হয়েছিল।
ফ্যালেনেরেপার

1
এটা আমার জন্য ঠিক কাজ করে। var data = $("#avatar-form").serializefiles();এজ্যাক্স ডেটা প্যারামিটারের মাধ্যমে এটি প্রেরণ এবং এক্সপ্রেস শক্তিশালী বিশ্লেষণের সাথে ডেটা পাওয়ার সাথে সাথে: form.parse(req, function(err, fields, files){এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ :)
শুরিগ এইচ

23

যদি আপনার ফর্মটি আপনার এইচটিএমএলে সংজ্ঞায়িত করা হয় তবে ফর্মটি কনট্রাক্টরের কাছে পুনরাবৃত্তি করা এবং চিত্রগুলি যুক্ত করার চেয়ে পাস করা সহজ।

$('#my-form').submit( function(e) {
    e.preventDefault();

    var data = new FormData(this); // <-- 'this' is your form element

    $.ajax({
            url: '/my_URL/',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',     
            success: function(data){
            ...

9

ডিভেন ভেনেবলের উত্তর আমি যা চেয়েছিলাম তার কাছাকাছি ছিল, তবে আমি এমন একটি চেয়েছিলাম যা একাধিক ফর্মের উপর কাজ করবে এবং ফর্মটিতে ইতিমধ্যে উল্লিখিত ক্রিয়াটি ব্যবহার করুন যাতে প্রতিটি ফাইল সঠিক জায়গায় যায়।

আমি jQuery এর () পদ্ধতিটিও ব্যবহার করতে চেয়েছিলাম যাতে আমি .ডিআর () ব্যবহার এড়াতে পারি।

এটি আমার কাছে পৌঁছেছে: (আপনার jQuery নির্বাচকের সাথে ফর্মসিলিেক্টর প্রতিস্থাপন করুন)

$(document).on('submit', formSelecter, function( e ) {
        e.preventDefault();
    $.ajax( {
        url: $(this).attr('action'),
        type: 'POST',
        data: new FormData( this ),
        processData: false,
        contentType: false
    }).done(function( data ) {
        //do stuff with the data you got back.
    });

});

2

আজকাল আপনার এমনকি jQuery :) দরকার নেই API সমর্থন টেবিল আনুন

let result = fetch('url', {method: 'POST', body: new FormData(document.querySelector("#form"))})

ফাইল আপলোডের প্রসঙ্গে fetchদয়া করে সামঞ্জস্যতাটি দেখুন: বিকাশকারী.মোজিলা.আর.ইন-
ওমর তারিক

@ ওমারতরিক হ্যাঁ আমার উত্তরে আমিও একই রকম লিঙ্ক রেখেছি))
অ্যালেক্স নিকুলিন

উফ। আমি কীভাবে এটি মিস করতে পারি:-|
ওমর তারিক

1

ফর্মডাটা ক্লাসটি কাজ করে, তবে আইওএস সাফারিতে (অন্তত আইফোনে) আমি রাফেল শোয়েকার্টের সলিউশনটি যেমন ব্যবহার করতে পারি নি তখনই।

মোজিলা দেবের ফর্মডাটা অবজেক্টগুলি পরিচালনা করার জন্য একটি দুর্দান্ত পৃষ্ঠা রয়েছে ।

সুতরাং, এনটাইপটি নির্দিষ্ট করে আপনার পৃষ্ঠায় কোথাও একটি খালি ফর্ম যুক্ত করুন:

<form enctype="multipart/form-data" method="post" name="fileinfo" id="fileinfo"></form>

তারপরে, ফর্মডাটা অবজেক্টটি তৈরি করুন:

var data = new FormData($("#fileinfo"));

এবং রাফেলের কোড হিসাবে এগিয়ে যান ।


আমার জ্যাকোরি অজ্যাক্স আপলোডগুলি নীরবে সাফারিতে ঝুলতে সমস্যা হয়েছিল এবং ব্রাউজারের শর্তসাপেক্ষে '(' ফর্ম-নাম ') শেষ করলাম IE সম্ভবত মাল্টি-আপলোডগুলির জন্য একটি আদর্শ সমাধান নয় তবে আমি একটি জিকিউরি ডায়ালগ থেকে একটি আইফ্রেমে একটি ফাইলের জন্য এটি করছিলাম যাতে এটি ঠিক আছে।
গ্লাইফ

1

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

উদাহরণস্বরূপ, আমি http://server.com/context?param=x এ পোস্ট করছিলাম

ক্রোমের নেটওয়ার্ক ট্যাবে আমি এই অনুরোধটির জন্য সঠিক গুণিত শিরোনাম দেখেছি কিন্তু তারপরে একটি 302 http://server.com/context/?param=x এ পুনঃনির্দেশ করুন (প্রসঙ্গের পরে স্ল্যাশটি নোট করুন)

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


1

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

formData.append (val.name, val.value);


1

ফাইল ইনপুট যদি nameএকটি অ্যারের এবং পতাকা ইঙ্গিত multiple, এবং আপনি সমগ্র পার্স formসঙ্গে FormData, এটি iteratively করার প্রয়োজন নেই append()ইনপুট ফাইল। FormDataস্বয়ংক্রিয়ভাবে একাধিক ফাইল পরিচালনা করবে।

$('#submit_1').on('click', function() {
  let data = new FormData($("#my_form")[0]);

  $.ajax({
    url: '/path/to/php_file',
    type: 'POST',
    data: data,
    processData: false,
    contentType: false,
    success: function(r) {
      console.log('success', r);
    },
    error: function(r) {
      console.log('error', r);
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="my_form">
  <input type="file" name="multi_img_file[]" id="multi_img_file" accept=".gif,.jpg,.jpeg,.png,.svg" multiple="multiple" />
  <button type="button" name="submit_1" id="submit_1">Not type='submit'</button>
</form>

নোট করুন যে একটি নিয়মিত button type="button"ব্যবহৃত হয়, না type="submit"। এটি দেখায় যে submitএই কার্যকারিতাটি পাওয়ার জন্য কোনও নির্ভরতা নেই ।

$_FILESক্রোম দেব সরঞ্জামগুলিতে ফলাফলটি এন্ট্রি এর মতো:

multi_img_file:
  error: (2) [0, 0]
  name: (2) ["pic1.jpg", "pic2.jpg"]
  size: (2) [1978036, 2446180]
  tmp_name: (2) ["/tmp/phphnrdPz", "/tmp/phpBrGSZN"]
  type: (2) ["image/jpeg", "image/jpeg"]

দ্রষ্টব্য: একক ফাইল হিসাবে আপলোড করার সময় কিছু চিত্র ঠিকঠাক আপলোড করবে এমন ক্ষেত্রে রয়েছে তবে একাধিক ফাইলের সেট আপলোড করার সময় সেগুলি ব্যর্থ হবে। লক্ষণগুলি হ'ল পিএইচপি খালি $_POSTএবং $_FILESএজেএক্স ছাড়াই কোনও ত্রুটি ছুঁড়ে ফেলেছে reports ক্রোম 75.0.3770.100 এবং পিএইচপি 7.0 এর সাথে ইস্যুটি ঘটে। কেবলমাত্র আমার পরীক্ষার সেটটিতে কয়েক ডজন চিত্রের মধ্যে 1 টি ঘটবে বলে মনে হচ্ছে।


0

IE এর পুরানো সংস্করণগুলি ফর্মড্যাটা সমর্থন করে না (ফর্মডাটার জন্য সম্পূর্ণ ব্রাউজার সমর্থন তালিকাটি এখানে রয়েছে: https://developer.mozilla.org/en-US/docs/Web/API/FormData )।

হয় আপনি একটি jquery প্লাগইন ব্যবহার করতে পারেন (যেমন, http://malsup.com/jquery/form/#code-sample ) অথবা, আপনি এজ্যাক্স: https: // বিকাশকারী মাধ্যমে মাল্টিপার্ট ফর্ম ডেটা পোস্ট করতে IFrame ভিত্তিক সমাধান ব্যবহার করতে পারেন । mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript


0

পিএইচপি

<?php 
    var_dump( $_FILES ); 
?>

jQuery এবং ফর্ম এইচটিএমএল

$( "#form" ).bind( "submit", function (e) {

    e.preventDefault();

    $.ajax({

        method: "post",
        url: "process.php",

        data: new FormData( $(this) ), // $(this) = formHTML element

        cache: false,

        /* upload */
        contentType: false,
        processData: false

    });

} )
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<form id="form" >
    File: <input type="file" name="upload" />
    <input type="submit" value="Submit" />
</form>


-1
  1. jquery-> $ ("# আইডি") দ্বারা ফর্ম অবজেক্ট পান [0]
  2. ডেটা = নতুন ফর্মডেটা ($ ("# আইডি") [0]);
  3. ঠিক আছে, তথ্য আপনার চান

"(" # আইডি ") [0] প্রথমে ফর্মটি কোনও খালি <ইনপুট টাইপ =" ফাইল "/> দেয় না, আপনি তার সমস্ত <ইনপুট টাইপ =" ফাইল "/> সহ পুরো ফর্মটি কীভাবে জমা করবেন?
মোহাম্মদ-হোসেইন জামালি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.