Alguém pode explicar como implementar o plugin jQuery File Upload?

116

EDITAR (outubro de 2019):

6 anos depois, o jQuery File Upload claramente ainda está deixando as pessoas loucas. Se você encontrar pouco consolo nas respostas aqui, tente pesquisar no NPM para encontrar uma alternativa moderna. Não vale a pena o aborrecimento, eu prometo.

Eu recomendei Uploadify na edição anterior, mas, como um comentarista apontou, eles não parecem mais oferecer uma versão gratuita. Uploadify foi tão 2013 de qualquer maneira.


EDITAR:

Isso ainda parece estar recebendo tráfego, então vou explicar o que acabei fazendo. Acabei fazendo o plugin funcionar seguindo o tutorial na resposta aceita. No entanto, jQuery File Upload é um verdadeiro aborrecimento e se você está procurando um plugin de upload de arquivo mais simples, eu recomendo o Uploadify . Como uma resposta apontada, é gratuito apenas para uso não comercial.


fundo

Estou tentando usar o jQuery File Upload do blueimp para permitir que os usuários carreguem arquivos. Fora da caixa, ele funciona perfeitamente , seguindo as instruções de configuração. Mas para usá-lo de forma prática em meu site, quero poder fazer algumas coisas:

  • Incluir o uploader em qualquer uma das minhas páginas existentes
  • Altere o diretório dos arquivos carregados

Todos os arquivos do plugin estão localizados em uma pasta na raiz.

Eu tentei...

  • Movendo a página de demonstração para a raiz e atualizando os caminhos para os scripts necessários
  • Alterando as opções 'upload_dir' e 'upload_url' no arquivo UploadHandler.php conforme sugerido aqui .
  • Alterar o URL na segunda linha do javascript de demonstração

Em todos os casos, os shows de visualização, ea barra de progresso é executado, mas os arquivos não conseguem carregar, e eu recebo este erro no console: Uncaught TypeError: Cannot read property 'files' of undefined. Não entendo como funcionam todas as partes do plugin, o que está dificultando a depuração.

Código

O javascript na página de demonstração:

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


Estou surpreso com a falta de documentação; parece que deveria ser algo simples de mudar. Eu apreciaria se alguém pudesse explicar como fazer isso.

Austen
fonte
10
Bom formato de pergunta. É bom ver organização.
jdero
imprima 'e' e 'dados' no console antes da linha de erro, quais são os valores?
john 4d5
3
Uploadi fy é uma licença do MIT, por exemplo, é totalmente gratuito. No entanto, Uploadi Five do mesmo dev / website custa $ 5- $ 100 dependendo do uso
MartinJH
2
Em dois anos, a documentação do jQuery-File-Upload não melhorou. Argh.
Chuck Le Butt
1
@MartinJH pode ter havido um uploadify em algum ponto, mas no momento só existe um - a versão paga uploadiFive. E também não há demonstração; é apenas um vídeo. Forma ruim.
Steve Horvath

Respostas:

72

Eu estava procurando uma funcionalidade semelhante alguns dias atrás e me deparei com um bom tutorial sobre tutorialzine. Aqui está um exemplo prático. O tutorial completo pode ser encontrado aqui .

Forma simples para manter a caixa de diálogo de upload de arquivo:

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

E aqui está o código jQuery para fazer upload dos arquivos:

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

E aqui está o exemplo de código PHP para processar os dados:

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

O código acima pode ser adicionado a qualquer formulário existente. Este programa carrega automaticamente as imagens, assim que forem adicionadas. Esta funcionalidade pode ser alterada e você pode enviar a imagem, enquanto envia seu formulário existente.

Atualizei minha resposta com código real. Todos os créditos ao autor original do código.

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

Subrat Pattnaik
fonte
2
Você pode copiar as partes importantes desse tutorial aqui, então, se ele desaparecer, sua resposta ainda será útil?
1
mas tenha cuidado para não plagiar
tacaswell
1
ATENÇÃO: Para qualquer pessoa usando o trecho de código PHP, remova a if($_POST) instrução. O POST deve estar vazio quando o conteúdo do arquivo é enviado $_FILES['upfile']['tmp_name']. Esperançosamente, isso poupa algum tempo.
Edward
1
Encontrado outro c-sharpcorner.com/UploadFile/da55bf/…
Rush.2707
Alguém pode me sugerir quais são os arquivos js / jquery necessários para executar o script acima
Manasa
28

Acabei de passar 2 horas lutando com jQuery Upload, mas desisti por causa da quantidade de dependências (eu tinha 13 arquivos JS incluídos para obter todos os sinos e assobios).

Pesquisei um pouco mais e encontrei um projeto bacana chamado Dropzone.js , que não tem dependências.

O autor também criou uma demonstração de bootstrap que foi inspirada no plugin jQuery File Upload.

Espero que isso poupe mais alguém algum tempo.

Tim
fonte
1
Algo importante a ser observado: Dropzone.js parece bom, mas só oferece suporte a partir do IE10 e superior. Suporte para upload de arquivo jQuery do IE6;)
Nickvda
11
O jQuery File Upload é simplesmente impossível de fazer funcionar ... Passei muitas horas tentando porque tem recursos muito legais, mas no último minuto minha alma só se encheu de agonia !!! Que desespero !!! Então vi seu post sobre o Dropzone.js e em 5 minutos fiz funcionar e do jeito que queria! Você me salvou ...
rigon
Não posso agradecer o suficiente, gastei quase 12 horas fazendo com que o jQuery-FIle-Upload funcionasse da maneira que eu queria e finalmente me deparei com esta questão. Você me salvou.
ndd
aqui está um exemplo de upload de arquivo jquery baseado em banco de dados: github.com/CodeHeight/ImageLibrary
JoshYates1980
Passei 3 dias, mas ainda não consigo customizar o código deles
May Weather VN
4

Eu também tive dificuldades com isso, mas consegui fazer funcionar assim que descobri como os caminhos funcionam em UploadHandler.php: upload_dir e upload_url são as únicas configurações a serem observadas para fazê-lo funcionar. Verifique também os logs de erros do servidor para obter informações de depuração.

Louis Ferreira
fonte
3

Confira o uploader de arrastar e soltar de imagens com visualização de imagem usando o 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
fonte
Esta é uma solução extremamente simples.
Miron
2

Este é um bom plugin do Angular para upload de arquivos, e é grátis!

upload de arquivo angular

Sahip
fonte
2
Oi. Não poste links como respostas, se o site ficar off-line ou o link mudar, sua resposta se tornará inútil. Em vez disso, use as informações do site para construir sua resposta e use o link apenas como referência. Obrigado.
Cthulhu
1

Eu lutei com esse plugin por um tempo no Rails, e então alguém o tornou obsoleto, tornando todo o código que eu havia criado.

Embora pareça que você não está usando isso no Rails, se alguém estiver usando, verifique esta joia . A fonte está aqui -> jQueryFileUpload Rails .

Atualizar:

Para satisfazer o comentador, atualizei minha resposta. Essencialmente, " use esta gema , aqui está o código-fonte ". Se ela desaparecer, faça-o pelo caminho mais longo.

engenheiroDave
fonte
1

Droply.js é perfeito para isso. É simples e vem pré-embalado com um site de demonstração que funciona fora da caixa.

Geremia
fonte
0

Você pode usar o uploadify, este é o melhor plugin multiupload jquery que eu usei.

A implementação é fácil, o suporte ao navegador é perfeito.

CORSÁRIO
fonte
7
requer flash ... :(
Eva
2
Você pode usar a versão HTML 5 :)
CORSAIR de
5
Se não me engano, a versão html5 do uploadify não é gratuita. Custa $ 5. uploadify.com/download
0112
2
Mas, isso é apenas 5 $, não 500.
CORSAIR
7
Lembre-se, se você deseja usar o uploadify para fins comerciais, você precisa comprar a licença comercial ($ 100) uploadify.com/download/download-uploadifive-commercial
Tim
0

Para o plugin de IU, com página jsp e Spring MVC ..

Amostra de html . Precisa estar dentro de um elemento de formulário com um atributo id de 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>

Gerenciadores de solicitação de upload e exclusão de amostra

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

Classe de amostra para gerar a resposta json necessária

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

}

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

Timothy Anyona
fonte