Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159

Сохранить файл, пришедший из js

14.04.2015, 13:05. Показов 3485. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Прошу помощи, так как уже не знаю в какую сторону копать. Есть у меня сервер на питоне. Заготовку взял где-то в интернете, потом допиливал под свои нужды. Возвращать файлы с сервера у меня получатся. Но вот встала нужда сохранять файлы на сервер. Пользователь выбирает файл и потом я этот файл пытаюсь передать с помощью js на сервер, а там его сохранить. Файл бинарный. Что я пробовал:

1) js'ом получать файл как base64, а питоном его конвертировать обратно и сохранять
2) js'ом получать файл как байты, а потом питоном сохранять
3) js'ом каждый байт кодировал в hex, а потом питоном расшифоровывал обратно и сохранял
4) чего-то там еще )

подскажите, пожалуйста, человеческий работающий способ. Заранее благодарю
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2015, 13:05
Ответы с готовыми решениями:

Открыть файл, разделить ячейку на 1000, сохранить файл, закрыть файл
Макрос должен запускаться, спрашивать - какой файл ему взять. Открыть его, разделить определенную ячейку на 1000, сохранить файл. ...

Спроецировать файл данных. спроецированный файл сохранить в другой указанный файл
помогите с программой! вот вроде бы должна быть рабочая версия, но не понимаю как избавиться от ошибок. заранее благодарен (если возможно -...

Как добавить в переменную пришедший параметр?
Всем привет у меня есть некий скрипт: <?php $from = ""; $email = ""; $topic = ""; <...> echo "Письмо отправлено" ...

7
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.04.2015, 14:59
xTr1m, Все проще чем ты думаешь, с помощью js я делал это так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
function updateProgressBar(value) {
//Функция для обновления состояния прогресс бара
    var progressBar = $('#progress_bar')[0];
    progressBar.value = value;
    progressBar.getElementsByTagName('span')[0].innerHTML = value;
}
 
 
function validateData() {
    // Вызывается при нажатии на кнопку отправить, проверяет
    // переданные данные и если передано, то что нужно, подготавливает
    // данные к отправке
    var data = new FormData();
    var xhr = new window.XMLHttpRequest();
 
    var file_list = $("input[name=data_movies]")[0].files;
    var storage = $("input[name=storage]")[0].value;
    var permitted = {'film_info.js': true, 'posters': true}
 
    if (file_list.length == 2 && permitted[file_list[0].name] && permitted[file_list[1].name]) {
        data.append('storage', storage);
        for (var i = 0; i < file_list.length; i++) {
            data.append('data_movies', file_list[i]);
        }
        updateFiles(xhr, data)
    } else {
        alert('Вы выбрали больше файлов чем нужно или выбрали не те файлы')
    }
}
 
function updateFiles(xhr, data) {
    /*
    Функция загружает на сервер данные с помощью ajax и информирует
    о том сколько будет длится загрузка
    */
    function uploadProgress(evt) {
        //Отображает процесс отправки файла
        if (evt.lengthComputable) {
            var percentComplete = evt.loaded / evt.total * 100;
            updateProgressBar(percentComplete);
            console.log(percentComplete);
        }
    }
 
    function downloadProgress(evt) {
        //Отображает процесс скачивания файла
        if (evt.lengthComputable) {
            var percentComplete = evt.loaded / evt.total * 100;
            console.log(percentComplete);
        }
    }
 
    $.ajax({
        xhr: function() {
            xhr.upload.addEventListener("progress", uploadProgress, false);
            xhr.addEventListener("progress", downloadProgress, false);
            return xhr;
        },
        type: 'POST',
        url: '/take_data/',
        data: data,
        processData: false,
        contentType: false,
        dataType: "json",
        success: function(data) {
            alert('Данные загружены, скоро фильмы будут добавлены в БД')
        },
        error: function(data) {
            alert('При загрузке данных возникла ошибка');
            console.log(data)
        }
    });
}
А на сервере принимаешь форму и извлекаешь из неё файлы и сохраняешь. Во flask это вот так делается:
Python
1
2
3
4
5
6
7
8
9
@app.route('/take_data/', methods=['GET', 'POST'])
def take_data():
    storage = request.form['storage']
    uploaded_files = request.files.getlist('data_movies')
    for file_ in uploaded_files:
        filename = secure_filename(file_.filename)
        file_.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    add.main(storage)
    return jsonify(status='ok')
xTr1m, а если использовать обычные формы html, то все ещё проще и js вообще не нужен.
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
14.04.2015, 15:24  [ТС]
Спасибо. Но у мне все же несколько другая ситуация. Сервер у меня самый простой + я все же использую fileReader в js. То есть пользователь выбирает файл, я его считываю с помощью fileReader, в его result (кажется) у меня находится содержимое файла. Причем файл - это excel. С простым текстовым, наверное, проще было бы. А на стороне питона я получаю bytes.

Может я просто не понял, как можно из html прямо сразу передать файл.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.04.2015, 15:37
http://htmlbook.ru/samhtml5/formy/zagruzka-failov

Цитата Сообщение от xTr1m Посмотреть сообщение
Сервер у меня самый простой
Так указывать надо все, потому что все штатные экстрасенсы в отпуске и ни кто не в курсе какой у тебя там сервер.
Цитата Сообщение от xTr1m Посмотреть сообщение
я все же использую fileReader в js
Ну я тебе уже показал правильный путь. Можешь конечно и дальше в стенку биться лбом, только не понимаю зачем на форум тогда писать, если
Цитата Сообщение от xTr1m Посмотреть сообщение
я все же использую fileReader в js
используй
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
14.04.2015, 17:44  [ТС]
Вот на чем я споткнулся. Так передаю из js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var data = new FormData();
var files = document.getElementById("selectFileId").files;           
data.append('xls', files);
            
$.ajax({
        type: 'POST',
        url: '/add_campaign',
        data: data,
        processData: false,
        contentType: false,
        dataType: "json",
        success: function(data) {
            alert('Данные загружены, скоро фильмы будут добавлены в БД')
        },
        error: function(data) {
            alert('При загрузке данных возникла ошибка');
            console.log(data)
        }
    });
но на стороне питона уже не получается. ваш пример с
Python
1
2
3
4
uploaded_files = request.files.getlist('data_movies')
    for file_ in uploaded_files:
        filename = secure_filename(file_.filename)
        file_.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
у меня не выходит, так как у request нет поля типа files. у меня среда показывает, что request - имеет тип сокет. порывшись в свойствах self, нашел rfile и wfile. Но их сохранить не удалось, возможно, это вообще не то. Вот мой код обработки post
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def do_POST(self):
        if self.path.startswith("/add_campaign"):
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
 
            folderPath = os.path.dirname(os.path.abspath(__file__))
            varLen = int(self.headers['Content-Length'])
            
            # вот тут значение типа 'b\\'------WebKitFormBoundaryBoLy7qQZl6B8WdDA\\r\\nContent-Disposition: form-data; name="xls"\\r\\n\\r\\n[object FileList]\\r\\n------WebKitFormBoundaryBoLy7qQZl6B8WdDA--\\r\\n\\''
            coded_string = str(self.rfile.read(varLen))
 
            self.wfile.save(folderPath, "123.xls")
            uploaded_files = self.rfile.getlist('xls')            
 
            for file in uploaded_files:
                #filename = secure_filename(file_.filename)
                file.save(folderPath, "123.xls")
биться головой об бетон я люблю, но не очень долго =)) может еще натолкнете в какую сторону копать?)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.04.2015, 17:48
Цитата Сообщение от xTr1m Посмотреть сообщение
но на стороне питона уже не получается. ваш пример с
Мой пример касается только конкретного фреемворка, flask. Что ты у себя там использушь я понятия не имею. Я уже сказал я не экстрасенс и угадывать с чем же ты там работаешь не собираюсь.
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
14.04.2015, 18:54  [ТС]
использую вроде бы самый простор вариант вэб-сервера
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from os import curdir
from os.path import join as pjoin
 
from http.server import BaseHTTPRequestHandler, HTTPServer
 
class StoreHandler(BaseHTTPRequestHandler):
    store_path = pjoin(curdir, 'store.json')
 
    def do_GET(self):
        if self.path == '/store.json':
            with open(self.store_path) as fh:
                self.send_response(200)
                self.send_header('Content-type', 'text/json')
                self.end_headers()
                self.wfile.write(fh.read().encode())
 
    def do_POST(self):
        if self.path == '/store.json':
            length = self.headers['content-length']
            data = self.rfile.read(int(length))
 
            with open(self.store_path, 'w') as fh:
                fh.write(data.decode())
 
            self.send_response(200)
 
 
server = HTTPServer(('', 8080), StoreHandler)
server.serve_forever()
вот так вот текстовые файлы принимать получается. а с бинарным уже проблема
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.04.2015, 19:00
Вот тут вроде нужный пример есть, пробуй http://stackoverflow.com/quest... -save-file
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2015, 19:00
Помогаю со студенческими работами здесь

Как на PHP считать пришедший в ответ JSON
Привет. Во вконтакте для получения ключа доступа нужно пройти Authorization Code Flow. Получить код проблем не составило. По их...

Как обработать запрос SOAP, пришедший на страницу
С ним никогда раньше не работал и по инфе из гугля понять ничего не смог. Прикручиваю на сайт оплату киви, нужно всего лишь то...

Как создать аналог командам "файл-> открыть", "файл->сохранить", "Файл->сохранить как"
На форме создано меню &quot;файл ... &quot; (как в любой обычной программе). Нужно теперь сделать кнопку с функциями открытия проекта аналог...

Как раздать интернет, пришедший с Wi-Fi адаптера, роутером D-Link DIR-300?
Здравствуйте! Интернет я получаю посредством Wi-Fi адаптера ALFA AWUS 036H. Раздать его хочу при помощи роутера D-Link DIR-300. Адаптер...

JQuery и setInterval, как повесить событие на элемент DOM, пришедший из APPEND'A?
как сделать чтобы функция alert(&quot;ok!&quot;); срабатывала при событии click на метке с id=&quot;lab&quot;? &lt;div id='content'&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru