Kan iemand uitleggen hoe je de jQuery File Upload-plug-in implementeert?

6 jaar later en jQuery-bestandsupload maakt mensen duidelijk nog steeds gek. Als je weinig troost vindt in de antwoorden hier, probeer dan een zoekopdracht naar NPMvoor een modern alternatief. Het is het gedoe niet waard, dat beloof ik.

Ik heb Uploadify aanbevolen in de vorige bewerking, maar, zoals een commentator opmerkte, ze lijken niet langer een gratis versie aan te bieden. Uploadify was toch dus2013.


EDIT:

Dit lijkt nog steeds verkeer te krijgen, dus ik zal uitleggen wat ik uiteindelijk heb gedaan. Ik kreeg de plug-in uiteindelijk werkend door de tutorial in het geaccepteerde antwoord te volgen. JQuery-bestandsupload is echter een heel gedoe en als u op zoek bent naar een eenvoudigere plug-in voor het uploaden van bestanden, zou ik [Uploadify](http://www.uploadify.com) ten zeerste aanbevelen. Zoals een antwoord al aangaf, is het alleen gratis voor niet-commercieel gebruik.


Achtergrond

Ik probeer jQuery File Uploadvan blueimp te gebruiken om gebruikers toe te staan te uploaden bestanden. Uit de doos werkt het perfect, volgens de installatie-instructies. Maar om het praktisch op mijn website te gebruiken, wil ik een aantal dingen kunnen doen:

  • De uploader opnemen op een van mijn bestaande pagina’s
  • Verander de map voor geüploade bestanden

Alle bestanden voor de plug-in bevinden zich in een map onder de hoofdmap.

Ik heb geprobeerd…

  • De demopagina naar de root verplaatsen en de paden voor de benodigde scripts bijwerken
  • De opties ‘upload_dir’ en ‘upload_url’ in het UploadHandler.php-bestand wijzigen zoals voorgesteld hier.
  • De URL in de tweede regel van het demo-javascript wijzigen

In alle gevallen wordt het voorbeeld weergegeven en wordt de voortgangsbalk uitgevoerd, maar de bestanden kunnen niet worden geüpload en ik krijg deze foutmelding in de console: Uncaught TypeError: Cannot read property 'files' of undefined. Ik begrijp niet hoe alle onderdelen van de plug-in werken, waardoor het moeilijk is om fouten op te sporen.

Code

Het javascript op de demopagina:

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

Ik ben verrast door het gebrek aan documentatie; het lijkt alsof het eenvoudig zou moeten zijn om te veranderen. Ik zou het op prijs stellen als iemand zou kunnen uitleggen hoe dit moet.


Antwoord 1, autoriteit 100%

Ik was een paar dagen geleden op zoek naar een vergelijkbare functionaliteit en kwam een goede tutorial tegen op tutorialzine. Hier is een werkend voorbeeld. De volledige tutorial is hierte vinden.

Eenvoudig formulier om de dialoog voor het uploaden van bestanden te houden:

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

En hier is de jQuery-code om de bestanden te uploaden:

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

En hier is het PHP-codevoorbeeld om de gegevens te verwerken:

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

De bovenstaande code kan aan elk bestaand formulier worden toegevoegd. Dit programma uploadt automatisch afbeeldingen zodra ze zijn toegevoegd. Deze functionaliteit kan worden gewijzigd en u kunt de afbeelding verzenden terwijl u uw bestaande formulier indient.

Mijn antwoord bijgewerkt met de daadwerkelijke code. Alle credits voor de oorspronkelijke auteur van de code.

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


Antwoord 2, autoriteit 41%

Ik heb net 2 uur gevochten met jQuery Upload, maar heb het opgegeven vanwege de hoeveelheid afhankelijkheden (ik had 13 JS-bestanden bijgevoegd om alle toeters en bellen te krijgen).

Ik heb wat meer gezocht en kwam een mooi project tegen met de naam Dropzone.js, dat geen eventuele afhankelijkheden.

De auteur heeft ook een bootstrap-demogemaakt die is geïnspireerd op de jQuery File Upload-plug-in.

Ik hoop dat dit iemand anders wat tijd bespaart.


Antwoord 3, autoriteit 5%

Ik worstelde hier ook mee, maar kreeg het werkend toen ik erachter kwam hoe de paden in UploadHandler.php werken: upload_dir en upload_url zijn ongeveer de enige instellingen om naar te kijken om het werkend te krijgen. Controleer ook uw serverfoutlogboeken voor foutopsporingsinformatie.


Antwoord 4, autoriteit 4%

Bekijk de uploader voor het slepen en neerzetten van afbeeldingen met afbeeldingsvoorbeeld met behulp van de dropper jQuery-plug-in.

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


Antwoord 5, Autoriteit 3%

Dit is een goede hoekplug-in voor het uploaden van bestanden en het is gratis!

angular file upload


Antwoord 6

Ik worstelde een tijdje met deze plug-in op rails, en dan is iemand opgegraven, het verouderde van alle code die ik had gemaakt.

Hoewel het eruit ziet alsof je dit niet gebruikt in rails, maar als iemand het gebruikt, controleer dit edelsteen . De bron is hier – & GT; jQueryfileuploadrails .

update:

Om de commentator te bevredigen, heb ik mijn antwoord bijgewerkt. In wezen “Gebruik dit edelsteen , Hier is de broncode “als het verdwijnt, doe het dan de lange weg.


Antwoord 7

Hallo Probeer Stair Link Het is heel gemakkelijk. Ik heb lange tijd vastgebeeld en het lost mijn probleem op enkele minuten op.
http://simpleeupload.michaelcbrook.com/#examples


Antwoord 8

druppel.js is hier perfect voor. Het is eenvoudig en wordt voorverpakt met een demo-site die uit de doos werkt.


Antwoord 9

Het is 2021 en hier is een fantastisch eenvoudige plug-in om alles te uploaden:

https://pqina.nl/filepond/?ref=pqina

Voeg uw element toe:

<input type="file" 
class="filepond"
name="filepond" 
multiple 
data-allow-reorder="true"
data-max-file-size="3MB"
data-max-files="3">

Registreer eventuele extra plug-ins:

 FilePond.registerPlugin(
FilePondPluginImagePreview,  
FilePondPluginImageExifOrientation,  
FilePondPluginFileValidateSize,  
FilePondPluginImageEdit);

DAN DRAAD IN HET ELEMENT:

// Select the file input and use 
// create() to turn it into a pond
FilePond.create(
  document.querySelector('input'),
  // Use Doka.js as image editor
  imageEditEditor: Doka.create({
    utils: ['crop', 'filter', 'color']
  })
);

Ik gebruik dit met de extra Doka Image Editor om afbeeldingen te uploaden en te transformeren op https: //www.yoodu. Co.uk

gek eenvoudig om in te stellen en de jongens die het uitvoeren zijn geweldig bij ondersteuning.

Zoals je kunt zien, ben ik een fanboy.


Antwoord 10

U kunt uploaden
Dit is de beste MultiUpload JQuery-plug-in die ik heb gebruikt.

De implementatie is eenvoudig, de browserondersteuning is perfect.


Antwoord 11

Voor de UI-plug-in, met jsp-pagina en Spring MVC..

Voorbeeld html. Moet zich binnen een form-element bevinden met een id-kenmerk van 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
            //https://stackoverflow.com/questions/5795936/how-to-set-a-javascript-var-as-undefined
            maxFileSizeBytes = void 0;
        }
        //https://github.com/blueimp/jQuery-File-Upload/wiki/Options
        //https://stackoverflow.com/questions/34063348/jquery-file-upload-basic-plus-ui-and-i18n
        //https://stackoverflow.com/questions/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>

Voorbeeld van upload- en verwijderingsverzoekhandlers

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

Voorbeeldklasse voor het genereren van de vereiste JSON-reactie

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

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

Other episodes