загрузка нескольких файлов с использованием ajax - PullRequest
2 голосов
/ 15 ноября 2010

Я пытаюсь добиться загрузки нескольких файлов с помощью Ajax, или, по крайней мере, это должно выглядеть как ajax (без перезагрузки страницы). Ниже мой код ...

Я могу сделать это с помощью простой отправки. В приведенном выше коде я могу получить список всех файлов, восстановить некоторые файлы, а затем загрузить остальные на сервер. но я хочу сделать это как ajax, с индикатором выполнения. Я не могу использовать файл api, так как python на стороне сервера не получает объект файла тогда. Любая помощь приветствуется.

<!DOCTYPE html>

загрузчик

    <script type="text/javascript">
        var file_array = [];
        var file_name_cell,relation_cell, option_cell, sr_no_cell;
        var rowId = 0;
        var fileCount = 1;
        var new_file_id = '';
        var array_last_index = 0;


        /* ----------- To add file name in the hidden field start ----------- */

        function addFileName(fileId){
            var file = document.getElementById(fileId);
            for(var i=0; i<file.files.length; i++){
                file_array.push(file.files.item(i).fileName);

            }
            $('#file_names').val(file_array.join('^'));
            file.style.display = 'none';
            createNewFileInput();
            addRow();

        }

        /* ----------- To add file name in the hidden field end ----------- */

        /* ----------- To create and display new file input start ------------ */

        function createNewFileInput(){
            fileCount += 1
            new_file_id = 'files_' + fileCount;

            var new_file_input = document.createElement('input');
            new_file_input.setAttribute('type', 'file');
            new_file_input.setAttribute('name', new_file_id);
            new_file_input.setAttribute('id', new_file_id);
            new_file_input.setAttribute('multiple', 'multiple');
            new_file_input.setAttribute('onchange', 'addFileName(\'' + new_file_id + '\')');
            document.getElementById('file_input_area').appendChild(new_file_input);

        }

        /* ----------- To create and display new file input end  ------------ */

        /* ----------- To add row in the table start ----------- */

        function addRow(){
            var table = document.getElementById('selected_files_table_body');
            var last_row,
                row;
            for(var i=array_last_index; i<file_array.length; i++){
                rowId += 1;
                try{
                    last_row = table.rows.length;
                }
                catch(e){
                    row = table.insertRow(0);
                }
                row = table.insertRow(last_row);
                row.id = rowId;
                sr_no_cell = row.insertCell(0);
                sr_no_cell.innerHTML = rowId+'.';
                file_name_cell = row.insertCell(1);
                file_name_cell.style.textAlign = 'left';
                file_name_cell.innerHTML = file_array[i];
                option_cell = row.insertCell(2);
                option_cell.innerHTML = '<a href="javascript<b></b>:void(0)"><img src="/django_forms_media/icon/remove.png" onclick="removeRow(' + rowId + ',\'' + file_array[i] + '\');" border=0 /></a>&nbsp;';


            }
            array_last_index = file_array.length;

        }

        /* ----------- To add row in the table end ----------- */


        /* ----------- To remove row from the table start ----------- */

        function removeRow(removeRowId, file_to_remove){
            var row = document.getElementById(removeRowId);
            row.parentNode.removeChild(row);
            removeFileName(file_to_remove);
        }

        /* ----------- To remove row from the table end ----------- */

        /* ----------- To remove specific file name from hidden field and array start ----------- */

        function removeFileName(file_to_remove){
            for (var i = 0; i < file_array.length; i++) {
                if (file_array[i] == file_to_remove) {
                    file_array.splice(i, 1);
                    array_last_index -= 1;
                    break;
                }
            }
            $('#file_names').val(file_array.join('^'));
        }

        /* ----------- To remove specific file name from hidden field and array end ----------- */

        /* ----------- To clear the file array and removing all rows start ----------- */

        function clearAllFiles(){
            file_array = [];
            var table = document.getElementById("selected_files_table_body");
            for (var i = table.rows.length - 1; i > 0; i--) {
                table.deleteRow(i);
                rowId = 0;
            }
        }

        /* ----------- To clear the file array and removing all rows end ----------- */


    </script>
</head>
<body>
    <div >

        <div >
            <div >
                <fieldset>
                    <legend>
                        Upload Package
                    </legend>
                    <form id="frm_upload_package" name="frm_upload_package" action="/djangoforms/uploadcontents/" method="post" enctype="multipart/form-data">
                        <div class="selectfile">
                            <label>
                                Select Files:
                            </label>
                            <br/>
                        </div>
                        <span id="file_input_area">
                            <input id="files_1" type="file" name="files_1" multiple = "multiple" onchange="addFileName('files_1');"/>
                            <input id="file_names" type="hidden" size=100 name="fileNames" />
                        </span>
                        <fieldset style="width:70%;">
                            <legend>Selected Files</legend>
                            <table id = "selected_files_table" name = "selected_files_table" style="margin-left:0" class="sortable" cellspacing="0" cellpadding="3" border="0">
                                <thead>
                                    <tr>
                                        <th>Sr.No.</th>
                                        <th>File Name</th>
                                        <th>Option</th>

                                    </tr>
                                </thead>
                                <tbody id = "selected_files_table_body" name = "selected_files_table_body">
                                </tbody>
                            </table>
                        </fieldset>
                        <div class="buttonrow">
                            <input type="button" value="Upload" id="upload_package" name="upload_package">&nbsp;
                            <input type="reset" name="reset_button" id="reset_button" value="Cancel" onclick ="clearAllFiles();"/>

                        </div>
                    </form>
                </fieldset>
            </div>
        </div>
    </div>
</body>

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

Вы должны использовать скрытый iframe и отправлять туда данные, невозможно загружать файлы с XMLHttpRequest.Кроме того, есть множество плагинов jQuery, которые выполняют эту работу, вы можете посмотреть на них.

3 голосов
/ 21 ноября 2010

Неправда, что файлы не могут быть загружены через JavaScript. Это можно сделать с помощью метода sendAsBinary, который существовал начиная с Firefox 3.5. В Firefox 4+ (также в Chrome 5+ и Safari 5+) есть также поддержка интерфейса FormData , который позволяет легко создавать multipart/form-data запросы (подробнее об этом можно узнать на * 1006). * Подробнее о том, как отправлять файлы через XMLHttpRequest, см. http://blog.igstan.ro/2009/01/pure-javascript-file-upload.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...