Ai đó có thể giải thích cách triển khai plugin Tải lên tệp jQuery không?


116

EDIT (tháng 10 năm 2019):

6 năm sau và Tải lên tệp jQuery rõ ràng vẫn đang khiến mọi người phát điên. Nếu bạn đang tìm thấy một chút an ủi trong các câu trả lời ở đây, hãy thử tìm kiếm NPM cho một giải pháp thay thế hiện đại. Nó không đáng để làm phiền, tôi hứa.

Tôi đã khuyến nghị Uploadify trong lần chỉnh sửa trước nhưng, như một nhà bình luận đã chỉ ra, họ không còn xuất hiện để cung cấp một phiên bản miễn phí. Uploadify là như vậy 2013 dù sao.


BIÊN TẬP:

Điều này dường như vẫn nhận được lưu lượng truy cập vì vậy tôi sẽ giải thích những gì tôi đã làm. Cuối cùng tôi đã có plugin hoạt động bằng cách làm theo hướng dẫn trong câu trả lời được chấp nhận. Tuy nhiên, Tải lên tệp jQuery là một rắc rối thực sự và nếu bạn đang tìm kiếm một plugin tải lên tệp đơn giản hơn, tôi rất khuyến nghị Uploadify . Như một câu trả lời đã chỉ ra, nó chỉ miễn phí cho sử dụng phi thương mại.


Lý lịch

Tôi đang cố gắng sử dụng Tải lên tệp jQuery của blueimp để cho phép người dùng tải lên các tệp. Ra khỏi hộp nó hoạt động hoàn hảo , làm theo các hướng dẫn thiết lập. Nhưng để sử dụng nó thực tế trên trang web của tôi, tôi muốn có thể làm một vài điều:

  • Bao gồm trình tải lên trên bất kỳ trang nào hiện có của tôi
  • Thay đổi thư mục cho các tập tin tải lên

Tất cả các tệp cho plugin được đặt trong một thư mục dưới thư mục gốc.

Tôi đã thử ...

  • Di chuyển trang demo vào thư mục gốc và cập nhật các đường dẫn cho các tập lệnh cần thiết
  • Thay đổi tùy chọn 'upload_dir' và 'upload_url' trong tệp UploadHandler.php như được đề xuất ở đây .
  • Thay đổi URL trong dòng thứ hai của javascript demo

Trong mọi trường hợp, phần xem trước hiển thị và thanh tiến trình chạy, nhưng các tệp không tải lên được và tôi gặp lỗi này trong bảng điều khiển : Uncaught TypeError: Cannot read property 'files' of undefined. Tôi không hiểu làm thế nào tất cả các phần của plugin hoạt động gây khó khăn cho việc gỡ lỗi.

Các javascript trong trang 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');
});


Tôi ngạc nhiên vì thiếu tài liệu; Có vẻ như đó là một điều đơn giản để thay đổi. Tôi sẽ đánh giá cao nếu ai đó có thể giải thích làm thế nào để làm điều này.


10
Định dạng câu hỏi hay. Rất vui khi thấy tổ chức.
jdero

in 'e' và 'dữ liệu' trong bảng điều khiển ngay trước dòng lỗi, các giá trị là gì?
john 4d5

3
Uploadi fy là giấy phép MIT, ví dụ như nó hoàn toàn miễn phí. Tuy nhiên, Uploadi Five từ cùng một nhà phát triển / trang web là $ 5- $ 100 tùy theo cách sử dụng
MartinJH

2
Trong hai năm, tài liệu jQuery-File-Upload không thể tốt hơn được nữa. Argh.
Chuck Le Mông

1
@MartinJH có thể đã có một lượt tải lên tại một số điểm, nhưng cho đến nay chỉ có một - phiên bản uploadiFive trả phí. Và cũng không có bản demo nào; đó chỉ là một video. Hình thức kém.
Steve Horvath

Câu trả lời:


72

Tôi đã tìm kiếm một chức năng tương tự vài ngày trước và tình cờ thấy một hướng dẫn tốt về hướng dẫn. Đây là một ví dụ làm việc. Hướng dẫn đầy đủ có thể được tìm thấy ở đây .

Hình thức đơn giản để giữ đối thoại tải lên tệp:

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

Và đây là mã jQuery để tải lên các tệp:

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

Và đây là mẫu mã PHP để xử lý dữ liệu:

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

Các mã trên có thể được thêm vào bất kỳ hình thức hiện có. Chương trình này tự động tải lên hình ảnh, một khi chúng được thêm vào. Chức năng này có thể được thay đổi và bạn có thể gửi hình ảnh, trong khi bạn đang gửi biểu mẫu hiện có của mình.

Cập nhật câu trả lời của tôi với mã thực tế. Tất cả các khoản tín dụng cho tác giả ban đầu của mã.

Nguồn: http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/


2
Bạn có thể sao chép các phần quan trọng của hướng dẫn đó ở đây không, vì vậy nếu nó biến mất, câu trả lời của bạn vẫn hữu ích?

1
nhưng hãy cẩn thận để không đạo văn
tacaswell

1
CHÚ Ý: Đối với bất kỳ ai sử dụng đoạn mã PHP, hãy xóa if($_POST) câu lệnh. POST được cho là trống, nội dung tập tin được gửi vào $_FILES['upfile']['tmp_name']. Hy vọng điều này sẽ giúp ai đó tiết kiệm thời gian.
Edward


bất cứ ai có thể gợi ý cho tôi các tập tin js / jquery cần thiết để chạy đoạn script trên
Manasa

28

Tôi mới dành 2 giờ để chiến đấu với jQuery Upload nhưng đã bỏ cuộc vì số lượng phụ thuộc (Tôi có 13 tệp JS để có tất cả chuông và còi).

Tôi đã tìm kiếm thêm một chút và tình cờ thấy một dự án gọn gàng có tên Dropzone.js , không có bất kỳ sự phụ thuộc nào.

Tác giả cũng đã tạo một bản demo bootstrap được lấy cảm hứng từ plugin Tải lên tệp jQuery.

Tôi hy vọng điều này sẽ giúp người khác tiết kiệm thời gian.


1
Điều quan trọng cần lưu ý: Dropzone.js trông đẹp, nhưng nó chỉ hỗ trợ từ IE10 trở lên. Hỗ trợ tải lên tệp jQuery từ IE6;)
Nickvda

11
Tải lên tệp jQuery không thể làm cho nó hoạt động được ... Tôi đã gửi nhiều giờ cố gắng vì nó có các tính năng rất hay, nhưng vào phút cuối, tâm hồn tôi chỉ tràn đầy đau đớn !!! Thật là một sự tranh chấp !!! Sau đó, tôi đã thấy bài đăng của bạn về Dropzone.js và trong 5 phút tôi làm cho nó hoạt động và theo cách tôi muốn! Bạn đã cứu tôi ...
rigon

Không thể cảm ơn đủ, tôi đã dành gần 12 giờ để tải jQuery-FIle-Upload hoạt động theo cách tôi muốn và cuối cùng tôi đã vấp phải câu hỏi này. Bạn đã cứu tôi.
ndd

đây là một ví dụ tải lên tập tin jquery dựa trên cơ sở dữ liệu: github.com/CodeHeight/ImageL
Library

Tôi đã dành 3 ngày nhưng tôi vẫn không thể tùy chỉnh mã của họ
May Weather VN

4

Tôi cũng đã vật lộn với điều này nhưng nó đã hoạt động khi tôi tìm ra cách các đường dẫn hoạt động trong UploadHandler.php: upload_dir và upload_url là về các cài đặt duy nhất cần xem xét để làm cho nó hoạt động. Ngoài ra kiểm tra nhật ký lỗi máy chủ của bạn để biết thông tin gỡ lỗi.


3

Kiểm tra trình tải lên và thả hình ảnh với phần xem trước hình ảnh bằng cách sử dụng plugin jquery dropper.

HTML

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

Mã não

$(".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


Đây là một giải pháp cực kỳ đơn giản.
Miron

2

Đây là plugin Angular tốt để tải lên các tệp và miễn phí!

tải lên tập tin góc


2
Chào. Vui lòng không đăng liên kết dưới dạng câu trả lời, nếu trang web ngoại tuyến hoặc liên kết thay đổi, câu trả lời của bạn sẽ trở nên vô dụng. Thay vào đó, sử dụng thông tin trên trang web để xây dựng câu trả lời của bạn và chỉ sử dụng liên kết làm tài liệu tham khảo. Cảm ơn.
Cthulhu

1

Tôi đã vật lộn với plugin này trong một thời gian trên Rails, và sau đó ai đó đã đá quý nó làm lỗi thời tất cả các mã tôi đã tạo.

Mặc dù có vẻ như bạn không sử dụng điều này trong Rails, tuy nhiên nếu có ai đang sử dụng thì hãy kiểm tra viên ngọc này . Nguồn ở đây -> jQueryFileUpload Rails .

Cập nhật:

Để thỏa mãn người bình luận, tôi đã cập nhật câu trả lời của mình. Về cơ bản " sử dụng đá quý này , đây là mã nguồn " Nếu nó biến mất thì hãy thực hiện theo cách lâu dài.



1

Droply.js là hoàn hảo cho việc này. Nó đơn giản và được đóng gói sẵn với một trang web demo hoạt động tốt.


0

Bạn có thể sử dụng uploadify đây là plugin jquery multiupload tốt nhất tôi đã sử dụng.

Việc thực hiện dễ dàng, hỗ trợ trình duyệt hoàn hảo.


7
yêu cầu flash ... :(
Eva

2
Bạn có thể sử dụng Phiên bản HTML 5 :)
CORSAIR

5
Nếu tôi không nhầm, phiên bản html5 của uploadify không miễn phí. Nó có giá 5 đô la. uploadify.com/d
0112

2
Nhưng, đây chỉ là 5 đô la chứ không phải 500.
CORSAIR

7
Hãy nhớ rằng, nếu bạn muốn sử dụng uploadify cho mục đích thương mại, bạn cần mua giấy phép thương mại ($ 100) uploadify.com/doad/doad-uploadifive-commIAL
Tim

0

Đối với plugin UI, với trang jsp và Spring MVC ..

Mẫu html . Cần phải nằm trong một hình thức phần tử với một id thuộc tính của 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>

Mẫu xử lý tải lên và xóa yêu cầu

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

Lớp mẫu để tạo phản hồi json cần thiết

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

}

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.