การรวม Dropzone.js เข้ากับฟอร์ม HTML ที่มีอยู่กับฟิลด์อื่น


181

ขณะนี้ฉันมีรูปแบบ HTML ซึ่งผู้ใช้กรอกรายละเอียดของโฆษณาที่พวกเขาต้องการโพสต์ ตอนนี้ฉันต้องการที่จะเพิ่มdropzoneสำหรับการอัปโหลดภาพของรายการที่จะขาย

ฉันพบDropzone.jsซึ่งดูเหมือนจะทำสิ่งที่ฉันต้องการมากที่สุด อย่างไรก็ตามเมื่อดูในเอกสารดูเหมือนว่าคุณจะต้องระบุคลาสของแบบฟอร์มทั้งหมดเป็นdropzone(ตรงข้ามกับองค์ประกอบอินพุตเท่านั้น) นี้ก็หมายความว่ารูปแบบทั้งหมดของฉันกลายเป็นDropzone

เป็นไปได้หรือไม่ที่จะใช้ dropzone ในส่วนของแบบฟอร์มของฉันเช่นโดยการระบุองค์ประกอบเป็น class "dropzone"แทนที่จะเป็นแบบฟอร์มทั้งหมดหรือไม่

ฉันสามารถใช้แบบฟอร์มแยกกัน แต่ฉันต้องการให้ผู้ใช้สามารถส่งได้ทั้งหมดด้วยปุ่มเดียว

หรือมีห้องสมุดอื่นที่สามารถทำสิ่งนี้ได้หรือไม่

ขอบคุณมาก

คำตอบ:


59

นี่เป็นอีกวิธีในการทำ: เพิ่มdivฟอร์มของคุณด้วย classname dropzone และใช้ dropzone โดยทางโปรแกรม

HTML:

<div id="dZUpload" class="dropzone">
      <div class="dz-default dz-message"></div>
</div>

JQuery:

$(document).ready(function () {
    Dropzone.autoDiscover = false;
    $("#dZUpload").dropzone({
        url: "hn_SimpeFileUploader.ashx",
        addRemoveLinks: true,
        success: function (file, response) {
            var imgName = response;
            file.previewElement.classList.add("dz-success");
            console.log("Successfully uploaded :" + imgName);
        },
        error: function (file, response) {
            file.previewElement.classList.add("dz-error");
        }
    });
});

หมายเหตุ: ปิดใช้งานการค้นพบอัตโนมัติมิฉะนั้น Dropzone จะพยายามแนบสองครั้ง

บทความบล็อก : Dropzone js + Asp.net: วิธีง่ายๆในการอัปโหลดภาพจำนวนมาก


25
ด้วยสิ่งนี้เขาไม่สามารถใช้ปุ่มส่งเริ่มต้นได้ แต่ก็ไม่ตอบคำถามของเขา
ผ่อนผัน

5
แต่สิ่งนี้ยังไม่ได้ใช้รูปแบบดั้งเดิมในการส่ง
dangel

3
นี่เป็นปัญหาของฉันและคุณแก้ไขได้แล้ว @Satindersingh
Su4p

1
@ Su4p: ดีใจที่ช่วยคุณได้นอกจากนี้คุณสามารถตรวจสอบลิงก์บทความบล็อกเพื่อดูคำอธิบายรายละเอียดพร้อมกับตัวเลือกการปรับขนาดภาพขณะอัพโหลด
Satinder singh

2
สิ่งนี้ช่วยได้มากคุณสามารถตั้งค่าองค์ประกอบใด ๆ เป็น dropzone หากคุณตั้งค่า URL ด้วยตนเอง ฉันใช้ตัวจัดการความสำเร็จเพื่อโพสต์ชื่อไฟล์ไปยังเขตข้อมูลที่ซ่อน / ปิดการใช้งานในรูปแบบหลัก
DigitalDesignDj

40

ฉันมีปัญหาเดียวกันที่แน่นอนและพบว่าคำตอบของ Varan Sinayee เป็นคำตอบเดียวที่แก้ไขคำถามเดิมได้ คำตอบนั้นสามารถทำให้เข้าใจได้ง่ายขึ้นดังนั้นนี่เป็นเวอร์ชั่นที่ง่ายกว่า

ขั้นตอนคือ:

  1. สร้างรูปแบบปกติ (อย่าลืมวิธีการและ enctype args เนื่องจากไม่ได้จัดการโดย dropzone อีกต่อไป)

  2. วาง div ข้างในด้วยclass="dropzone"(เป็นวิธีที่ Dropzone แนบกับมัน) และid="yourDropzoneName"(ใช้เพื่อเปลี่ยนตัวเลือก)

  3. ตั้งค่าตัวเลือกของ Dropzone เพื่อตั้งค่า URL ที่จะโพสต์รูปแบบและไฟล์ปิดการใช้งาน autoProcessQueue (ดังนั้นจะเกิดขึ้นเฉพาะเมื่อผู้ใช้กด 'ส่ง') และอนุญาตให้อัพโหลดหลายครั้ง (ถ้าคุณต้องการ)

  4. ตั้งค่าฟังก์ชั่นเริ่มต้นให้ใช้ Dropzone แทนพฤติกรรมเริ่มต้นเมื่อคลิกปุ่มส่ง

  5. ยังอยู่ในฟังก์ชั่น init ใช้ตัวจัดการเหตุการณ์ "sendmultiple" เพื่อส่งข้อมูลแบบฟอร์มไปพร้อมกับไฟล์

วันนี้! ตอนนี้คุณสามารถดึงข้อมูลเช่นเดียวกับที่คุณใช้กับแบบฟอร์มปกติใน $ _POST และ $ _FILES (ในตัวอย่างนี้จะเกิดขึ้นใน upload.php)

HTML

<form action="upload.php" enctype="multipart/form-data" method="POST">
    <input type="text" id ="firstname" name ="firstname" />
    <input type="text" id ="lastname" name ="lastname" />
    <div class="dropzone" id="myDropzone"></div>
    <button type="submit" id="submit-all"> upload </button>
</form>

JS

Dropzone.options.myDropzone= {
    url: 'upload.php',
    autoProcessQueue: false,
    uploadMultiple: true,
    parallelUploads: 5,
    maxFiles: 5,
    maxFilesize: 1,
    acceptedFiles: 'image/*',
    addRemoveLinks: true,
    init: function() {
        dzClosure = this; // Makes sure that 'this' is understood inside the functions below.

        // for Dropzone to process the queue (instead of default form behavior):
        document.getElementById("submit-all").addEventListener("click", function(e) {
            // Make sure that the form isn't actually being sent.
            e.preventDefault();
            e.stopPropagation();
            dzClosure.processQueue();
        });

        //send all the form data along with the files:
        this.on("sendingmultiple", function(data, xhr, formData) {
            formData.append("firstname", jQuery("#firstname").val());
            formData.append("lastname", jQuery("#lastname").val());
        });
    }
}

1
โซลูชันนี้ใช้งานได้ดี แต่ไม่ได้เปลี่ยนเส้นทางไปยังหน้าถัดไปอีกต่อไปเนื่องจากป้องกันพฤติกรรมการส่งเริ่มต้น
เฟลิกซ์จี

@TIIUNDER - มันเตรียมพร้อมสำหรับการส่งข้อมูลแบบฟอร์มผ่านการโทร ajax โดยไม่ต้องโหลดหน้าซ้ำ - นั่นเป็นเหตุผลว่าทำไมจึงมี e.preventDefault ();
born2fr4g

1
@TIUNDER คุณสามารถเพิ่มการเปลี่ยนเส้นทางในเหตุการณ์ที่ประสบความสำเร็จ
doflamingo

เป็นไปได้ไหมที่จะส่งแบบฟอร์มหลังการprocessQueue()โทร? ฉันพยายามใช้submit()หรือclick()ไม่ได้ผล
สีเทา Li

1
+1 นี่เป็นทางออกเดียวที่ทำงานได้ แทนการทำ formData.append หนึ่งโดยหนึ่งคุณยังสามารถทำ $(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); }); (ขออภัยผมไม่ทราบวิธีที่จะนำขึ้นบรรทัดใหม่ที่นี่)
Aximili

20

"dropzone.js" เป็นห้องสมุดที่ใช้กันทั่วไปสำหรับการอัพโหลดรูปภาพ หากคุณต้องการให้ "dropzone.js" เป็นเพียงส่วนหนึ่งของแบบฟอร์มของคุณคุณควรทำตามขั้นตอนต่อไปนี้:

1) สำหรับฝั่งไคลเอ็นต์:

HTML:

    <form action="/" enctype="multipart/form-data" method="POST">
        <input type="text" id ="Username" name ="Username" />
        <div class="dropzone" id="my-dropzone" name="mainFileUploader">
            <div class="fallback">
                <input name="file" type="file" multiple />
            </div>
        </div>
    </form>
    <div>
        <button type="submit" id="submit-all"> upload </button>
    </div>

JQuery:

    <script>
        Dropzone.options.myDropzone = {
            url: "/Account/Create",
            autoProcessQueue: false,
            uploadMultiple: true,
            parallelUploads: 100,
            maxFiles: 100,
            acceptedFiles: "image/*",

            init: function () {

                var submitButton = document.querySelector("#submit-all");
                var wrapperThis = this;

                submitButton.addEventListener("click", function () {
                    wrapperThis.processQueue();
                });

                this.on("addedfile", function (file) {

                    // Create the remove button
                    var removeButton = Dropzone.createElement("<button class='btn btn-lg dark'>Remove File</button>");

                    // Listen to the click event
                    removeButton.addEventListener("click", function (e) {
                        // Make sure the button click doesn't submit the form:
                        e.preventDefault();
                        e.stopPropagation();

                        // Remove the file preview.
                        wrapperThis.removeFile(file);
                        // If you want to the delete the file on the server as well,
                        // you can do the AJAX request here.
                    });

                    // Add the button to the file preview element.
                    file.previewElement.appendChild(removeButton);
                });

                this.on('sendingmultiple', function (data, xhr, formData) {
                    formData.append("Username", $("#Username").val());
                });
            }
        };
    </script>

2) สำหรับฝั่งเซิร์ฟเวอร์:

ASP.Net MVC

    [HttpPost]
    public ActionResult Create()
    {
        var postedUsername = Request.Form["Username"].ToString();
        foreach (var imageFile in Request.Files)
        {

        }

        return Json(new { status = true, Message = "Account created." });
    }

2
ขอบคุณสำหรับการโพสต์! แก้ไขปัญหาของฉัน อีกคำถามที่รวดเร็วนี้ไม่ทำงานเมื่อไม่มีภาพที่เลือก (เพื่ออัปโหลด) วิธีแก้ปัญหานี้?
Sato

BTW: ถ้าคุณใช้คอนโทรลเลอร์แอ็คชั่นที่มีการเชื่อมโยงโมเดลและส่งแบบฟอร์มของคุณเช่นนี้โมเดลจะว่างเปล่า ด้วยเหตุผลบางอย่างวิธีนี้จะไม่ผูกข้อมูลจริงกับโมเดล
Edward Chopuryan

1
เมื่อ autoProcessQueue = false จะไม่มีเหตุการณ์เกิดขึ้น
cyril

@Sato เมื่อคลิกปุ่มส่งเหตุการณ์คุณสามารถตรวจสอบความยาวของไฟล์ที่ยอมรับใน dropzone โดยใช้ galleryfile.getAcceptedFiles (). length และหากไม่มีไฟล์ที่อัพโหลดคุณควรส่งแบบฟอร์มของคุณ
Varan Sinayee

@EdwardChopuryan นี้ไม่เกี่ยวข้องกับวิธีการส่งข้อมูลโดย dropzone ดูเหมือนว่าปัญหาเกิดจาก "แผนการตั้งชื่อ" ของแท็กอินพุตบนแพลตฟอร์มของคุณเช่น ASP.Net MVC
Varan Sinayee

11

การสอนของ Enyoนั้นยอดเยี่ยม

ฉันพบว่าสคริปต์ตัวอย่างในบทช่วยสอนทำงานได้ดีสำหรับปุ่มที่ฝังอยู่ใน dropzone (เช่นองค์ประกอบแบบฟอร์ม) หากคุณต้องการมีปุ่มที่อยู่ด้านนอกองค์ประกอบของรูปแบบฉันสามารถทำให้สำเร็จได้โดยใช้เหตุการณ์คลิก:

ก่อนอื่น HTML:

<form id="my-awesome-dropzone" action="/upload" class="dropzone">  
    <div class="dropzone-previews"></div>
    <div class="fallback"> <!-- this is the fallback if JS isn't working -->
        <input name="file" type="file" multiple />
    </div>

</form>
<button type="submit" id="submit-all" class="btn btn-primary btn-xs">Upload the file</button>

จากนั้นแท็กสคริปต์ ....

Dropzone.options.myAwesomeDropzone = { // The camelized version of the ID of the form element

    // The configuration we've talked about above
    autoProcessQueue: false,
    uploadMultiple: true,
    parallelUploads: 25,
    maxFiles: 25,

    // The setting up of the dropzone
    init: function() {
        var myDropzone = this;

        // Here's the change from enyo's tutorial...

        $("#submit-all").click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            myDropzone.processQueue();
        }); 
    }
}

23
คุณไม่สามารถมีแบบฟอร์มในแบบฟอร์มและส่ง
พอล

1
เมื่อฉันลองสิ่งนี้ดูเหมือนว่าจะไม่สนใจคอนเทนเนอร์ดร็อป - พรีวิว Dropzone เพียงเพิ่มตัวอย่างไปที่ด้านล่างของแบบฟอร์ม คุณจะต้องเพิ่ม 'previewsContainer:' .dropzone-previews ',' ในการกำหนดค่าของคุณ
Aaron Hill

6
สิ่งนี้ไม่ตอบคำถามเดิม คำถามเดิมคือวิธีใช้ Dropzone กับแบบฟอร์มที่มีอยู่ไม่ใช่เกี่ยวกับตำแหน่งของปุ่มเพื่อทริกเกอร์การกระทำ
CSSian

7

นอกเหนือจากสิ่งที่ sqram พูดแล้ว Dropzone มีตัวเลือกที่ไม่มีเอกสารเพิ่มเติม "hiddenInputContainer" สิ่งที่คุณต้องทำคือตั้งค่าตัวเลือกนี้เป็นตัวเลือกของแบบฟอร์มที่คุณต้องการให้ผนวกฟิลด์ไฟล์ที่ซ่อนอยู่ และ voila! ฟิลด์ไฟล์ ".dz-hidden-input" ที่ Dropzone ปกติจะเพิ่มให้กับร่างกายจะย้ายไปยังรูปแบบของคุณอย่างน่าอัศจรรย์ ไม่มีการแก้ไขซอร์สโค้ดของ Dropzone

ขณะนี้สิ่งนี้ใช้งานได้เพื่อย้ายเขตข้อมูลไฟล์ Dropzone ลงในแบบฟอร์มของคุณเขตข้อมูลนั้นไม่มีชื่อ ดังนั้นคุณจะต้องเพิ่ม:

_this.hiddenFileInput.setAttribute("name", "field_name[]");

เพื่อ dropzone.js หลังจากบรรทัดนี้:

_this.hiddenFileInput = document.createElement("input");

รอบเส้น 547


5

ฉันมีทางออกอัตโนมัติเพิ่มเติมสำหรับสิ่งนี้

HTML:

<form role="form" enctype="multipart/form-data" action="{{ $url }}" method="{{ $method }}">
    {{ csrf_field() }}

    <!-- You can add extra form fields here -->

    <input hidden id="file" name="file"/>

    <!-- You can add extra form fields here -->

    <div class="dropzone dropzone-file-area" id="fileUpload">
        <div class="dz-default dz-message">
            <h3 class="sbold">Drop files here to upload</h3>
            <span>You can also click to open file browser</span>
        </div>
    </div>

    <!-- You can add extra form fields here -->

    <button type="submit">Submit</button>
</form>

JavaScript:

Dropzone.options.fileUpload = {
    url: 'blackHole.php',
    addRemoveLinks: true,
    accept: function(file) {
        let fileReader = new FileReader();

        fileReader.readAsDataURL(file);
        fileReader.onloadend = function() {

            let content = fileReader.result;
            $('#file').val(content);
            file.previewElement.classList.add("dz-success");
        }
        file.previewElement.classList.add("dz-complete");
    }
}

Laravel:

// Get file content
$file = base64_decode(request('file'));

ไม่จำเป็นต้องปิดการใช้งาน DropZone Discovery และการส่งแบบฟอร์มปกติจะสามารถส่งไฟล์พร้อมกับฟิลด์แบบฟอร์มอื่น ๆ ผ่านการทำให้เป็นอนุกรมแบบมาตรฐาน

กลไกนี้จัดเก็บเนื้อหาไฟล์เป็นสตริง base64 ในฟิลด์อินพุตที่ซ่อนอยู่เมื่อได้รับการประมวลผล คุณสามารถถอดรหัสมันกลับไปเป็นสตริงไบนารีใน PHP ได้ด้วยbase64_decode()วิธีมาตรฐาน

ฉันไม่ทราบว่าวิธีนี้จะถูกโจมตีด้วยไฟล์ขนาดใหญ่หรือไม่ แต่สามารถใช้งานได้กับไฟล์ ~ 40MB


คุณถอดรหัสและประมวลผลข้อมูลจากฟิลด์อื่นที่จะส่งพร้อมรูปภาพได้อย่างไร
sam

@sam ไม่จำเป็นต้องถอดรหัสฟิลด์อื่น พวกเขาไม่ได้รับการเข้ารหัสในตอนแรกเฉพาะไฟล์เท่านั้นที่ได้รับการเข้ารหัส
Umair Ahmed

คุณสามารถแบ่งปันรหัสตัวอย่างสำหรับ html, javascript และวิธีการดึงข้อมูลใน laravel php ได้ไหม
sam

2
หากคุณต้องการเพิ่มภาพ mutiple คุณต้องลบไฟล์ html และเพิ่ม quing js สำหรับแต่ละภาพ $ ('# fileUpload') ผนวก ('<input hidden name = "ไฟล์ []" ค่า =' + เนื้อหา + ' /> ') โดยที่เนื้อหาเป็นรูปภาพที่เข้ารหัส base64
AleXzpm

1
@codepushr มันเป็นคำตอบเก่าของเวลาที่เราไม่ได้พิจารณาโซลูชันที่ชำระเงิน ตอนนี้เราได้ซื้อ FileUploader แม้ว่ามันจะมี shenanigans ของตัวเอง แต่ก็พอเพียงที่จะบอกว่ามันสามารถปรับแต่งให้ทำเกือบทุกอย่าง
Umair Ahmed

4

คุณสามารถปรับเปลี่ยน formData โดยการจับ 'ส่ง' เหตุการณ์จาก dropzone ของคุณ

dropZone.on('sending', function(data, xhr, formData){
        formData.append('fieldname', 'value');
});

1
ฉันชอบคำตอบนี้ - แต่มันจะสมมติว่าชื่อฟิลด์และค่าได้รับการเติม สิ่งนี้จะถูกเรียกใช้ในการอัปโหลดซึ่งอาจเกิดขึ้นในเวลาที่แยกต่างหากกับการส่งแบบฟอร์ม ในคำอื่น ๆ คุณไม่สามารถสันนิษฐานได้ว่าเมื่อส่งภาพฟอร์มจะถูกกรอก
Antony

4

เพื่อส่งไฟล์ทั้งหมดพร้อมกับข้อมูลแบบฟอร์มอื่นในคำขอเดียวคุณสามารถคัดลอกinputโหนดซ่อนชั่วคราว Dropzone.js ลงในแบบฟอร์มของคุณ คุณสามารถทำได้ภายในaddedfilesตัวจัดการเหตุการณ์:

var myDropzone = new Dropzone("myDivSelector", { url: "#", autoProcessQueue: false });
myDropzone.on("addedfiles", () => {
  // Input node with selected files. It will be removed from document shortly in order to
  // give user ability to choose another set of files.
  var usedInput = myDropzone.hiddenFileInput;
  // Append it to form after stack become empty, because if you append it earlier
  // it will be removed from its parent node by Dropzone.js.
  setTimeout(() => {
    // myForm - is form node that you want to submit.
    myForm.appendChild(usedInput);
    // Set some unique name in order to submit data.
    usedInput.name = "foo";
  }, 0);
});

ก่อนหน้านี้เป็นวิธีแก้ปัญหาขึ้นอยู่กับรายละเอียดการใช้งาน รหัสที่มาเกี่ยวข้อง


โดยทั่วไปฉันใช้วิธีการนี้ แต่เนื่องจากความล่าช้าในการประมวลผลที่ชัดเจนในที่สุดตะขอติดการประมวลผลเนื้อหาไฟล์ภายใต้myDropzone.on("thumbnail", () => {})เหตุการณ์ การดำเนินการกับ"addedFile"ไฟล์ทันทีอาจยังundefinedอยู่ในระหว่างการเข้าถึง
Matti

ฉันกำลังพยายามใช้และทำงานในการนำฟิลด์อินพุตไฟล์ที่ซ่อนไปยังแบบฟอร์มและเมื่อฉันส่งข้อมูลโพสต์จะแสดงฟิลด์ของฉันfiles[]แต่มันจะว่างเปล่าไม่ว่าฉันจะทำอะไร ความคิดใด ๆ ทำใน Laravel ถ้ามันสร้างความแตกต่าง
เซน

สวัสดี! เหตุใดไฟล์ที่เลือกจึงอัปโหลด แต่ถ้าไฟล์ตกแล้วจะไม่เกิดข้อผิดพลาด (4)
Ingus

2

ฉันต้องการมีส่วนร่วมในการตอบคำถามที่นี่เช่นกันเมื่อฉันเผชิญกับปัญหาเดียวกัน - เราต้องการให้องค์ประกอบ $ _FILES พร้อมใช้งานเป็นส่วนหนึ่งของโพสต์เดียวกันเป็นแบบฟอร์มอื่น คำตอบของฉันขึ้นอยู่กับ @mrtnmgs อย่างไรก็ตามบันทึกความคิดเห็นที่เพิ่มลงในคำถามนั้น

ประการแรก: Dropzone โพสต์ข้อมูลผ่าน ajax

เพียงเพราะคุณใช้formData.appendตัวเลือกยังหมายความว่าคุณต้องจัดการกับการกระทำของ UX - นั่นคือทั้งหมดนี้เกิดขึ้นหลังฉากและไม่ใช่โพสต์รูปแบบทั่วไป ข้อมูลถูกโพสต์ไปยังurlพารามิเตอร์ของคุณ

ประการที่สอง: หากคุณต้องการเลียนแบบโพสต์คุณจะต้องเก็บข้อมูลที่โพสต์ไว้

สิ่งนี้ต้องใช้รหัสฝั่งเซิร์ฟเวอร์ในการจัดเก็บของคุณ$_POSTหรือ$_FILESในเซสชันที่ผู้ใช้สามารถโหลดหน้าอื่นได้เนื่องจากผู้ใช้จะไม่ไปที่หน้าที่ได้รับข้อมูลที่โพสต์

ประการที่สาม: คุณต้องเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าที่มีการใช้ข้อมูลนี้

ตอนนี้คุณได้โพสต์ข้อมูลของคุณเก็บไว้ในเซสชั่นคุณจะต้องแสดง / การกระทำสำหรับผู้ใช้ในหน้าเพิ่มเติม คุณต้องส่งผู้ใช้ไปยังหน้านั้นด้วย

ดังนั้นสำหรับตัวอย่างของฉัน:

[รหัส Dropzone: ใช้ Jquery]

$('#dropArea').dropzone({
    url:        base_url+'admin/saveProject',
    maxFiles:   1,
    uploadMultiple: false,
    autoProcessQueue:false,
    addRemoveLinks: true,
    init:       function(){
        dzClosure = this;

        $('#projectActionBtn').on('click',function(e) {
            dzClosure.processQueue(); /* My button isn't a submit */
        });

        // My project only has 1 file hence not sendingmultiple
        dzClosure.on('sending', function(data, xhr, formData) {
            $('#add_user input[type="text"],#add_user textarea').each(function(){
                formData.append($(this).attr('name'),$(this).val());
            })
        });

        dzClosure.on('complete',function(){
            window.location.href = base_url+'admin/saveProject';
        })
    },
});

1

นี่เป็นอีกตัวอย่างของวิธีที่คุณสามารถใช้ Dropzone.js ในแบบฟอร์มที่มีอยู่

dropzone.js:

 init: function() {

   this.on("success", function(file, responseText) {
     //alert("HELLO ?" + responseText); 
     mylittlefix(responseText);
   });

   return noop;
 },

จากนั้นต่อมาฉันก็ใส่ไฟล์

function mylittlefix(responseText) {
  $('#botofform').append('<input type="hidden" name="files[]" value="'+ responseText +'">');
}

สิ่งนี้จะถือว่าคุณมี div ที่มี id #botofformในการอัปโหลดคุณสามารถใช้ชื่อไฟล์ที่อัปโหลด

หมายเหตุ: สคริปต์อัปโหลดของฉันส่งคืน theuploadedfilename.jpeg dubblenote คุณจะต้องสร้างสคริปต์การล้างข้อมูลที่ตรวจสอบไดเรกทอรีอัปโหลดสำหรับไฟล์ที่ไม่ได้ใช้งานและลบออก .. หากอยู่ในรูปแบบที่ไม่ผ่านการตรวจสอบสิทธิ์ท้าย :)


สิ่งนี้จะไม่ส่งภาพ dropzone พร้อมกับช่องแบบฟอร์มอื่น ๆ สิ่งที่คุณกำลังทำคือการอัปโหลดภาพโดยปกติการบันทึกชื่อภาพแล้วส่งส่วนที่เหลือของฟิลด์แบบฟอร์มด้วยชื่อภาพอีกครั้ง
เซน

1

นี่คือตัวอย่างของฉันขึ้นอยู่กับ Django + Dropzone มุมมองได้เลือก (จำเป็น) และส่ง

<form action="/share/upload/" class="dropzone" id="uploadDropzone">
    {% csrf_token %}
        <select id="warehouse" required>
            <option value="">Select a warehouse</option>
                {% for warehouse in warehouses %}
                    <option value={{forloop.counter0}}>{{warehouse.warehousename}}</option>
                {% endfor %}
        </select>
    <button id="submit-upload btn" type="submit">upload</button>
</form>

<script src="{% static '/js/libs/dropzone/dropzone.js' %}"></script>
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script>
    var filename = "";

    Dropzone.options.uploadDropzone = {
        paramName: "file",  // The name that will be used to transfer the file,
        maxFilesize: 250,   // MB
        autoProcessQueue: false,
        accept: function(file, done) {
            console.log(file.name);
            filename = file.name;
            done();    // !Very important
        },
        init: function() {
            var myDropzone = this,
            submitButton = document.querySelector("[type=submit]");

            submitButton.addEventListener('click', function(e) {
                var isValid = document.querySelector('#warehouse').reportValidity();
                e.preventDefault();
                e.stopPropagation();
                if (isValid)
                    myDropzone.processQueue();
            });

            this.on('sendingmultiple', function(data, xhr, formData) {
                formData.append("warehouse", jQuery("#warehouse option:selected").val());
            });
        }
    };
</script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.