Adakah yang bisa menjelaskan cara menerapkan plugin jQuery File Upload?

117

EDIT (Okt 2019):

6 tahun kemudian dan Unggahan File jQuery jelas masih membuat orang gila. Jika Anda menemukan sedikit pelipur lara dalam jawabannya di sini, cobalah mencari NPM untuk alternatif modern. Ini tidak sebanding dengan kerumitannya, aku janji.

Saya merekomendasikan Uploadify di edit sebelumnya tetapi, seperti yang ditunjukkan oleh seorang pemberi komentar, mereka tampaknya tidak lagi menawarkan versi gratis. Uploadify begitu tahun 2013.


EDIT:

Ini sepertinya masih mendapatkan lalu lintas jadi saya akan menjelaskan apa yang akhirnya saya lakukan. Saya akhirnya mendapatkan plugin berfungsi dengan mengikuti tutorial dalam jawaban yang diterima. Namun, jQuery File Upload benar-benar merepotkan dan jika Anda mencari plugin unggah file yang lebih sederhana, saya akan sangat merekomendasikan Uploadify . Sebagai jawaban yang ditunjukkan, ini hanya gratis untuk penggunaan non-komersial.


Latar Belakang

Saya mencoba menggunakan jQuery File Upload blueimp untuk memungkinkan pengguna mengupload file. Di luar kotak itu berfungsi dengan sempurna , mengikuti instruksi pengaturan. Tetapi untuk menggunakannya secara praktis di situs web saya, saya ingin dapat melakukan beberapa hal:

  • Sertakan pengunggah di salah satu halaman saya yang ada
  • Ubah direktori untuk file yang diunggah

Semua file untuk plugin terletak di folder di bawah root.

Saya sudah mencoba ...

  • Memindahkan halaman demo ke root dan memperbarui jalur untuk skrip yang diperlukan
  • Mengubah opsi 'upload_dir' dan 'upload_url' di file UploadHandler.php seperti yang disarankan di sini .
  • Mengubah URL di baris kedua dari demo javascript

Dalam semua kasus, menunjukkan pratinjau, dan progress bar berjalan, tetapi file gagal untuk meng-upload, dan saya mendapatkan error ini di konsol: Uncaught TypeError: Cannot read property 'files' of undefined. Saya tidak mengerti bagaimana semua bagian dari plugin bekerja yang membuatnya sulit untuk di-debug.

Kode

Javascript di halaman demo:

$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = 'file_upload/server/php/UploadHandler.php',
    uploadButton = $('<button/>')
        .addClass('btn')
        .prop('disabled', true)
        .text('Processing...')
        .on('click', function () {
            var $this = $(this),
                data = $this.data();
            $this
                .off('click')
                .text('Abort')
                .on('click', function () {
                    $this.remove();
                    data.abort();
                });
            data.submit().always(function () {
                $this.remove();
            });
        });
$('#fileupload').fileupload({
    url: url,
    dataType: 'json',
    autoUpload: false,
    acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
    maxFileSize: 5000000, // 5 MB
    // Enable image resizing, except for Android and Opera,
    // which actually support image resizing, but fail to
    // send Blob objects via XHR requests:
    disableImageResize: /Android(?!.*Chrome)|Opera/
        .test(window.navigator.userAgent),
    previewMaxWidth: 100,
    previewMaxHeight: 100,
    previewCrop: true
}).on('fileuploadadd', function (e, data) {
    data.context = $('<div/>').appendTo('#files');
    $.each(data.files, function (index, file) {
        var node = $('<p/>')
                .append($('<span/>').text(file.name));
        if (!index) {
            node
                .append('<br>')
                .append(uploadButton.clone(true).data(data));
        }
        node.appendTo(data.context);
    });
}).on('fileuploadprocessalways', function (e, data) {
    var index = data.index,
        file = data.files[index],
        node = $(data.context.children()[index]);
    if (file.preview) {
        node
            .prepend('<br>')
            .prepend(file.preview);
    }
    if (file.error) {
        node
            .append('<br>')
            .append(file.error);
    }
    if (index + 1 === data.files.length) {
        data.context.find('button')
            .text('Upload')
            .prop('disabled', !!data.files.error);
    }
}).on('fileuploadprogressall', function (e, data) {
    var progress = parseInt(data.loaded / data.total * 100, 10);
    $('#progress .bar').css(
        'width',
        progress + '%'
    );
}).on('fileuploaddone', function (e, data) {
    $.each(data.result.files, function (index, file) {
        var link = $('<a>')
            .attr('target', '_blank')
            .prop('href', file.url);
        $(data.context.children()[index])
            .wrap(link);
    });
}).on('fileuploadfail', function (e, data) {
    $.each(data.result.files, function (index, file) {
        var error = $('<span/>').text(file.error);
        $(data.context.children()[index])
            .append('<br>')
            .append(error);
    });
}).prop('disabled', !$.support.fileInput)
    .parent().addClass($.support.fileInput ? undefined : 'disabled');
});


Saya terkejut dengan kurangnya dokumentasi; sepertinya itu adalah hal yang sederhana untuk diubah. Saya akan sangat menghargai jika seseorang dapat menjelaskan bagaimana melakukan ini.

Austen
sumber
10
Format pertanyaan yang bagus. Senang melihat organisasi.
jdero
cetak 'e' dan 'data' di konsol tepat sebelum baris kesalahan, apa nilainya?
john 4d5
3
Uploadi fy adalah lisensi MIT, misalnya sepenuhnya gratis. Namun, Uploadi Five dari dev / situs web yang sama adalah $ 5- $ 100 tergantung pada penggunaan
MartinJH
2
Dalam dua tahun, dokumentasi jQuery-File-Upload tidak menjadi lebih baik. Argh.
Chuck Le Butt
1
@MartinJH mungkin ada uploadify di beberapa titik, tapi sampai sekarang hanya ada satu - versi uploadiFive berbayar. Dan tidak ada demo juga; itu hanyalah sebuah video. Bentuk yang buruk.
Steve Horvath

Jawaban:

72

Saya sedang mencari fungsi serupa beberapa hari yang lalu dan menemukan tutorial yang bagus tentang tutorialzine. Berikut adalah contoh yang berfungsi. Tutorial lengkapnya bisa dilihat disini .

Bentuk sederhana untuk menampung dialog upload file:

<form id="upload" method="post" action="upload.php" enctype="multipart/form-data">
  <input type="file" name="uploadctl" multiple />
  <ul id="fileList">
    <!-- The file list will be shown here -->
  </ul>
</form>

Dan berikut adalah kode jQuery untuk mengupload file:

$('#upload').fileupload({

  // This function is called when a file is added to the queue
  add: function (e, data) {
    //This area will contain file list and progress information.
    var tpl = $('<li class="working">'+
                '<input type="text" value="0" data-width="48" data-height="48" data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" />'+
                '<p></p><span></span></li>' );

    // Append the file name and file size
    tpl.find('p').text(data.files[0].name)
                 .append('<i>' + formatFileSize(data.files[0].size) + '</i>');

    // Add the HTML to the UL element
    data.context = tpl.appendTo(ul);

    // Initialize the knob plugin. This part can be ignored, if you are showing progress in some other way.
    tpl.find('input').knob();

    // Listen for clicks on the cancel icon
    tpl.find('span').click(function(){
      if(tpl.hasClass('working')){
              jqXHR.abort();
      }
      tpl.fadeOut(function(){
              tpl.remove();
      });
    });

    // Automatically upload the file once it is added to the queue
    var jqXHR = data.submit();
  },
  progress: function(e, data){

        // Calculate the completion percentage of the upload
        var progress = parseInt(data.loaded / data.total * 100, 10);

        // Update the hidden input field and trigger a change
        // so that the jQuery knob plugin knows to update the dial
        data.context.find('input').val(progress).change();

        if(progress == 100){
            data.context.removeClass('working');
        }
    }
});
//Helper function for calculation of progress
function formatFileSize(bytes) {
    if (typeof bytes !== 'number') {
        return '';
    }

    if (bytes >= 1000000000) {
        return (bytes / 1000000000).toFixed(2) + ' GB';
    }

    if (bytes >= 1000000) {
        return (bytes / 1000000).toFixed(2) + ' MB';
    }
    return (bytes / 1000).toFixed(2) + ' KB';
}

Dan berikut ini contoh kode PHP untuk mengolah datanya:

if($_POST) {
    $allowed = array('jpg', 'jpeg');

    if(isset($_FILES['uploadctl']) && $_FILES['uploadctl']['error'] == 0){

        $extension = pathinfo($_FILES['uploadctl']['name'], PATHINFO_EXTENSION);

        if(!in_array(strtolower($extension), $allowed)){
            echo '{"status":"error"}';
            exit;
        }

        if(move_uploaded_file($_FILES['uploadctl']['tmp_name'], "/yourpath/." . $extension)){
            echo '{"status":"success"}';
            exit;
        }
        echo '{"status":"error"}';
    }
    exit();
}

Kode di atas dapat ditambahkan ke formulir yang sudah ada. Program ini secara otomatis mengunggah gambar, setelah ditambahkan. Fungsionalitas ini dapat diubah dan Anda dapat mengirimkan gambar, sementara Anda mengirimkan formulir yang sudah ada.

Memperbarui jawaban saya dengan kode sebenarnya. Semua kredit untuk penulis asli kode.

Sumber: http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/

Subrat Pattnaik
sumber
2
Bisakah Anda menyalin bagian penting dari tutorial itu di sini, jadi jika menghilang jawaban Anda masih berguna?
1
tapi hati-hati untuk tidak menjiplak
tacaswell
1
PERHATIAN: Untuk siapa saja yang menggunakan potongan kode PHP, hapus if($_POST) pernyataan tersebut. POST seharusnya mengosongkan konten file yang dikirim $_FILES['upfile']['tmp_name']. Semoga ini menghemat waktu seseorang.
Edward
Adakah yang bisa menyarankan saya apa saja file js / jquery yang diperlukan untuk menjalankan skrip di atas
Manasa
28

Saya baru saja menghabiskan 2 jam berjuang dengan jQuery Upload tetapi menyerah karena jumlah ketergantungan (saya memiliki 13 file JS disertakan untuk mendapatkan semua lonceng dan peluit).

Saya melakukan lebih banyak pencarian dan menemukan proyek rapi yang disebut Dropzone.js , yang tidak memiliki ketergantungan apa pun.

Penulis juga telah membuat demo bootstrap yang terinspirasi oleh plugin jQuery File Upload.

Saya harap ini menghemat waktu orang lain.

Tim
sumber
1
Hal penting untuk diperhatikan: Dropzone.js terlihat bagus, tetapi hanya mendukung dari IE10 dan yang lebih tinggi. Mendukung unggahan file jQuery dari IE6;)
Nickvda
11
Upload File jQuery tidak mungkin untuk membuatnya bekerja ... Saya mengirim berjam-jam mencoba karena memiliki fitur yang sangat bagus, tetapi pada menit terakhir jiwa saya hanya dipenuhi dengan penderitaan !!! Sungguh putus asa !!! Kemudian saya melihat posting Anda tentang Dropzone.js dan dalam 5 menit saya membuatnya berfungsi dan seperti yang saya inginkan! Anda menyelamatkan saya ...
rigon
Tidak bisa cukup berterima kasih, saya telah menghabiskan hampir 12 jam untuk mendapatkan jQuery-FIle-Upload bekerja seperti yang saya inginkan dan akhirnya saya menemukan pertanyaan ini. Kamu menyelamatkanku.
NDD
berikut adalah contoh upload file jquery database: github.com/CodeHeight/ImageLibrary
JoshYates1980
Saya menghabiskan 3 hari tetapi saya masih tidak dapat menyesuaikan kode mereka
Cuaca Mei VN
4

Saya juga berjuang dengan ini tetapi berhasil melakukannya setelah saya menemukan cara kerja jalur di UploadHandler.php: upload_dir dan upload_url adalah tentang satu-satunya pengaturan yang harus dilihat agar berfungsi. Periksa juga log kesalahan server Anda untuk informasi debug.

Louis Ferreira
sumber
3

Lihat pengunggah seret dan lepas gambar dengan pratinjau gambar menggunakan plugin dropper jquery.

HTML

<div class="target" width="78" height="100"><img /></div>

JS

$(".target").dropper({
    action: "upload.php",

}).on("start.dropper", onStart);
function onStart(e, files){
console.log(files[0]);

    image_preview(files[0].file).then(function(res){
$('.dropper-dropzone').empty();
//$('.dropper-dropzone').css("background-image",res.data);
 $('#imgPreview').remove();        
$('.dropper-dropzone').append('<img id="imgPreview"/><span style="display:none">Drag and drop files or click to select</span>');
var widthImg=$('.dropper-dropzone').attr('width');
        $('#imgPreview').attr({width:widthImg});
    $('#imgPreview').attr({src:res.data});

    })

}

function image_preview(file){
    var def = new $.Deferred();
    var imgURL = '';
    if (file.type.match('image.*')) {
        //create object url support
        var URL = window.URL || window.webkitURL;
        if (URL !== undefined) {
            imgURL = URL.createObjectURL(file);
            URL.revokeObjectURL(file);
            def.resolve({status: 200, message: 'OK', data:imgURL, error: {}});
        }
        //file reader support
        else if(window.File && window.FileReader)
        {
            var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onloadend = function () {
                imgURL = reader.result;
                def.resolve({status: 200, message: 'OK', data:imgURL, error: {}});
            }
        }
        else {
            def.reject({status: 1001, message: 'File uploader not supported', data:imgURL, error: {}});
        }
    }
    else
        def.reject({status: 1002, message: 'File type not supported', error: {}});
    return def.promise();
}

$('.dropper-dropzone').mouseenter(function() {
 $( '.dropper-dropzone>span' ).css("display", "block");
});

$('.dropper-dropzone').mouseleave(function() {
 $( '.dropper-dropzone>span' ).css("display", "none");
});

CSS

.dropper-dropzone{
    width:78px;
padding:3px;
    height:100px;
position: relative;
}
.dropper-dropzone>img{
    width:78px;
    height:100px;
margin-top=0;
}

.dropper-dropzone>span {
    position: absolute;
    right: 10px;
    top: 20px;
color:#ccc;


}

.dropper .dropper-dropzone{

padding:3px !important    
}

Demo Jsfiddle

tvshajeer.dll
sumber
Ini adalah solusi yang sangat sederhana.
Miron
2

Ini adalah plugin Angular yang bagus untuk mengunggah file, dan gratis!

unggah file sudut

Sahip
sumber
2
Hai. Mohon jangan posting link sebagai jawaban, jika situs offline atau link berubah, jawaban Anda akan menjadi tidak berguna. Alih-alih, gunakan info di situs untuk membuat jawaban Anda dan gunakan tautan sebagai referensi saja. Terima kasih.
Cthulhu
1

Saya berjuang dengan plugin ini untuk sementara waktu di Rails, dan kemudian seseorang mempermaknya dengan menghapus semua kode yang telah saya buat.

Meskipun sepertinya Anda tidak menggunakan ini di Rails, namun jika ada yang menggunakannya periksa permata ini . Sumbernya ada di sini -> jQueryFileUpload Rails .

Memperbarui:

Untuk memuaskan pemberi komentar, saya telah memperbarui jawaban saya. Pada dasarnya " gunakan permata ini , berikut adalah kode sumbernya " Jika hilang maka lakukan jauh.

engineerDave
sumber
1

Droply.js sangat cocok untuk ini. Sederhana dan sudah dikemas sebelumnya dengan situs demo yang berfungsi di luar kotak.

Geremia
sumber
0

Anda dapat menggunakan uploadify ini adalah plugin jquery multiupload terbaik yang pernah saya gunakan.

Implementasinya mudah, dukungan browsernya sempurna.

CORSAIR
sumber
7
membutuhkan flash ... :(
Eva
2
Anda dapat menggunakan HTML 5 Versi :)
CORSAIR
5
Jika saya tidak salah, uploadify versi html5 tidak gratis. Harganya $ 5. uploadify.com/download
0112
2
Tapi, ini hanya $ 5 bukan 500.
CORSAIR
7
Ingatlah, jika Anda ingin menggunakan uploadify untuk tujuan komersial, Anda perlu membeli lisensi komersial ($ 100) uploadify.com/download/download-uploadifive-commercial
Tim
0

Untuk plugin UI, dengan halaman jsp dan Spring MVC ..

Contoh html . Harus berada dalam elemen formulir dengan atribut id dari fileupload

    <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
<div class="fileupload-buttonbar">
    <div>
        <!-- The fileinput-button span is used to style the file input field as button -->
        <span class="btn btn-success fileinput-button">
            <i class="glyphicon glyphicon-plus"></i>
            <span>Add files</span>
            <input id="fileuploadInput" type="file" name="files[]" multiple>
        </span>
        <%-- https://stackoverflow.com/questions/925334/how-is-the-default-submit-button-on-an-html-form-determined --%>
        <button type="button" class="btn btn-primary start">
            <i class="glyphicon glyphicon-upload"></i>
            <span>Start upload</span>
        </button>
        <button type="reset" class="btn btn-warning cancel">
            <i class="glyphicon glyphicon-ban-circle"></i>
            <span>Cancel upload</span>
        </button>
        <!-- The global file processing state -->
        <span class="fileupload-process"></span>
    </div>
    <!-- The global progress state -->
    <div class="fileupload-progress fade">
        <!-- The global progress bar -->
        <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
            <div class="progress-bar progress-bar-success" style="width:0%;"></div>
        </div>
        <!-- The extended global progress state -->
        <div class="progress-extended">&nbsp;</div>
    </div>
</div>
<!-- The table listing the files available for upload/download -->
<table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/css/jquery.fileupload.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/css/jquery.fileupload-ui.css">

<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/js/vendor/jquery.ui.widget.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/js/jquery.iframe-transport.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/js/jquery.fileupload.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/js/jquery.fileupload-process.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/js/jquery.fileupload-validate.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-file-upload-9.14.2/js/jquery.fileupload-ui.js"></script>

<script type="text/javascript">
    $(document).ready(function () {
            var maxFileSizeBytes = ${maxFileSizeBytes};
        if (maxFileSizeBytes < 0) {
            //-1 or any negative value means no size limit
            //set to undefined
            ///programming/5795936/how-to-set-a-javascript-var-as-undefined
            maxFileSizeBytes = void 0;
        }

        //https://github.com/blueimp/jQuery-File-Upload/wiki/Options
        ///programming/34063348/jquery-file-upload-basic-plus-ui-and-i18n
        ///programming/11337897/how-to-customize-upload-download-template-of-blueimp-jquery-file-upload
        $('#fileupload').fileupload({
            url: '${pageContext.request.contextPath}/app/uploadResources.do',
            fileInput: $('#fileuploadInput'),
            acceptFileTypes: /(\.|\/)(jrxml|png|jpe?g)$/i,
            maxFileSize: maxFileSizeBytes,
            messages: {
                acceptFileTypes: '${fileTypeNotAllowedText}',
                maxFileSize: '${fileTooLargeMBText}'
            },
            filesContainer: $('.files'),
            uploadTemplateId: null,
            downloadTemplateId: null,
            uploadTemplate: function (o) {
                var rows = $();
                $.each(o.files, function (index, file) {
                    var row = $('<tr class="template-upload fade">' +
                            '<td><p class="name"></p>' +
                            '<strong class="error text-danger"></strong>' +
                            '</td>' +
                            '<td><p class="size"></p>' +
                            '<div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">' +
                            '<div class="progress-bar progress-bar-success" style="width:0%;"></div></div>' +
                            '</td>' +
                            '<td>' +
                            (!index && !o.options.autoUpload ?
                                    '<button class="btn btn-primary start" disabled>' +
                                    '<i class="glyphicon glyphicon-upload"></i> ' +
                                    '<span>${startText}</span>' +
                                    '</button>' : '') +
                            (!index ? '<button class="btn btn-warning cancel">' +
                                    '<i class="glyphicon glyphicon-ban-circle"></i> ' +
                                    '<span>${cancelText}</span>' +
                                    '</button>' : '') +
                            '</td>' +
                            '</tr>');
                    row.find('.name').text(file.name);
                    row.find('.size').text(o.formatFileSize(file.size));
                    if (file.error) {
                        row.find('.error').text(file.error);
                    }
                    rows = rows.add(row);
                });
                return rows;
            },
            downloadTemplate: function (o) {
                var rows = $();
                $.each(o.files, function (index, file) {
                    var row = $('<tr class="template-download fade">' +
                            '<td><p class="name"></p>' +
                            (file.error ? '<strong class="error text-danger"></strong>' : '') +
                            '</td>' +
                            '<td><span class="size"></span></td>' +
                            '<td>' +
                            (file.deleteUrl ? '<button class="btn btn-danger delete">' +
                                    '<i class="glyphicon glyphicon-trash"></i> ' +
                                    '<span>${deleteText}</span>' +
                                    '</button>' : '') +
                            '<button class="btn btn-warning cancel">' +
                            '<i class="glyphicon glyphicon-ban-circle"></i> ' +
                            '<span>${clearText}</span>' +
                            '</button>' +
                            '</td>' +
                            '</tr>');
                    row.find('.name').text(file.name);
                    row.find('.size').text(o.formatFileSize(file.size));
                    if (file.error) {
                        row.find('.error').text(file.error);
                    }
                    if (file.deleteUrl) {
                        row.find('button.delete')
                                .attr('data-type', file.deleteType)
                                .attr('data-url', file.deleteUrl);
                    }
                    rows = rows.add(row);
                });
                return rows;
            }
        });

    });
</script>

Contoh unggahan dan hapus penangan permintaan

    @PostMapping("/app/uploadResources")
public @ResponseBody
Map<String, List<FileUploadResponse>> uploadResources(MultipartHttpServletRequest request,
        Locale locale) {
    //https://github.com/jdmr/fileUpload/blob/master/src/main/java/org/davidmendoza/fileUpload/web/ImageController.java
    //https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#using-jquery-file-upload-ui-version-with-a-custom-server-side-upload-handler
    Map<String, List<FileUploadResponse>> response = new HashMap<>();
    List<FileUploadResponse> fileList = new ArrayList<>();

    String deleteUrlBase = request.getContextPath() + "/app/deleteResources.do?filename=";

    //http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/multipart/MultipartRequest.html
    Iterator<String> itr = request.getFileNames();
    while (itr.hasNext()) {
        String htmlParamName = itr.next();
        MultipartFile file = request.getFile(htmlParamName);
        FileUploadResponse fileDetails = new FileUploadResponse();
        String filename = file.getOriginalFilename();
        fileDetails.setName(filename);
        fileDetails.setSize(file.getSize());
        try {
            String message = saveFile(file);
            if (message != null) {
                String errorMessage = messageSource.getMessage(message, null, locale);
                fileDetails.setError(errorMessage);
            } else {
                //save successful
                String encodedFilename = URLEncoder.encode(filename, "UTF-8");
                String deleteUrl = deleteUrlBase + encodedFilename;
                fileDetails.setDeleteUrl(deleteUrl);
            }
        } catch (IOException ex) {
            logger.error("Error", ex);
            fileDetails.setError(ex.getMessage());
        }

        fileList.add(fileDetails);
    }

    response.put("files", fileList);

    return response;
}

@PostMapping("/app/deleteResources")
public @ResponseBody
Map<String, List<Map<String, Boolean>>> deleteResources(@RequestParam("filename") List<String> filenames) {
    Map<String, List<Map<String, Boolean>>> response = new HashMap<>();
    List<Map<String, Boolean>> fileList = new ArrayList<>();

    String templatesPath = Config.getTemplatesPath();
    for (String filename : filenames) {
        Map<String, Boolean> fileDetails = new HashMap<>();

        String cleanFilename = ArtUtils.cleanFileName(filename);
        String filePath = templatesPath + cleanFilename;

        File file = new File(filePath);
        boolean deleted = file.delete();

        if (deleted) {
            fileDetails.put(cleanFilename, true);
        } else {
            fileDetails.put(cleanFilename, false);
        }

        fileList.add(fileDetails);
    }

    response.put("files", fileList);

    return response;
}

Kelas sampel untuk menghasilkan respons json yang diperlukan

    public class FileUploadResponse {
    //https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#using-jquery-file-upload-ui-version-with-a-custom-server-side-upload-handler

    private String name;
    private long size;
    private String error;
    private String deleteType = "POST";
    private String deleteUrl;

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the size
     */
    public long getSize() {
        return size;
    }

    /**
     * @param size the size to set
     */
    public void setSize(long size) {
        this.size = size;
    }

    /**
     * @return the error
     */
    public String getError() {
        return error;
    }

    /**
     * @param error the error to set
     */
    public void setError(String error) {
        this.error = error;
    }

    /**
     * @return the deleteType
     */
    public String getDeleteType() {
        return deleteType;
    }

    /**
     * @param deleteType the deleteType to set
     */
    public void setDeleteType(String deleteType) {
        this.deleteType = deleteType;
    }

    /**
     * @return the deleteUrl
     */
    public String getDeleteUrl() {
        return deleteUrl;
    }

    /**
     * @param deleteUrl the deleteUrl to set
     */
    public void setDeleteUrl(String deleteUrl) {
        this.deleteUrl = deleteUrl;
    }

}

Lihat https://pitipata.blogspot.co.ke/2017/01/using-jquery-file-upload-ui.html

Timothy Anyona
sumber