Найти - Пользователи
Полная версия: загрузка файлов в mod_wsgi при использовании bottle
Начало » Web » загрузка файлов в mod_wsgi при использовании bottle
1
axe
Пробую загрузить файл под mod_wsgi. В качестве фрэймвёрка bottle.

Получаю все данные POST и GET и сохраняю их в один словарь:
@route( '/' )
@route( '/', method='POST' )
def main():
args = dict( request.GET.items())
args.update( dict( request.POST.items()) )
При таком создании args, не произойдёт ли какого-то неожиданного считывания файла в опаративную память?
args.value является геттером?

Мне нужно, чтобы место для хранения временных файлов было настраиваемым. Т.е. чтобы пользователь мог последовательно загрузить несколько файлов (по одному). И через некоторое время отправить запрос, по которому эти файлы будут дружно обработаны.

В mod_python для этих целей можно было сделать:
req_data = FieldStorage(req, True, file_callback=Storage)
где Storage - это класс, управляющий загрузкой (установить, например, куда складывать загружаемые файлы).

Как можно управлять загружаемыми файлами под mod_wsgi?
o7412369815963
там тот же FieldStorage, в ботле он завернут внутрь и управляется через request.POST
o7412369815963
я файлики загружаю с пом. ajax (без перезагрузки страницы), вот кусок серверной части
 175 @route('/posts/upload', method='POST')
176 def upload():
177 try:
179 fdata = request.POST['Filedata']
180 fname = request.POST['Filename']
181
195 if not os.path.isdir('./uploads/' + id): os.mkdir('./uploads/' + id)
196
197 f = open('./uploads/%s/%s' % (id,fname),'wb')
198 f.write( fdata.file.read() )
199 f.close()
204 except Exception as e:
205 return str(e)
сама запись у меня тупая, делал на скорую руку: f.write( fdata.file.read() )
по хорошему нужно загруженный темповый файл перемещать куда надо.
axe
o7412369815963
там тот же FieldStorage, в ботле он завернут внутрь и управляется через request.POST
я сомневаюсь, потому что:
from mod_python.util import FieldStorage
Хотя судя по docs.python.org/library/cgi.html, то FieldStorage есть внутри модуля cgi. Видимо, mod_python и bottle изначально вытаскивают FieldStorage оттуда?
axe
О, нашёл. mod_python → FieldStorage:
Access to form data is provided via the FieldStorage class. This class is similar to the standard library module cgi FieldStorage.
т.е. просто похожи.
axe
из кода bottle:
            data = cgi.FieldStorage(fp=fb, environ=safe_env, keep_blank_values=True)
axe
Вопрос всё же остаётся. Можно ли повлиять (на bottle?), чтобы временные файлы сразу складывались в нужную директорию? Хотя и имена было бы полезно переопределять.

Ещё был бы полезен некоторый анализ загружаемого файла перед загрузкой - определить тип/название/размер, но это уже по возможности.
o7412369815963
axe
Вопрос всё же остаётся. Можно ли повлиять (на bottle?), чтобы временные файлы сразу складывались в нужную директорию? Хотя и имена было бы полезно переопределять.

Ещё был бы полезен некоторый анализ загружаемого файла перед загрузкой - определить тип/название/размер, но это уже по возможности.
лучше не в нужную директорию, а получить имя файла для того что-б его переместить. я с этим ещё не разобрался, хотя тоже интересует.
нужную директорию наверно надо настраивать в веб севере т.к. он ведет прием файла, ну или в модуле wsgi.

"загружаемого файла перед загрузкой", этого не только в ботле нет, этого много где нет. по крайней мере штатно.
axe
В классе наследнике (от FieldStorage) мог бы быть переопределён метод make_file, определяющий создание временных файлов.

Но в bottle безоговорочно прописано использование стандартного cgi.FieldStorage. А можно было бы указать какой-нибудь if, типа если пришёл переопределённый класс, то использовать его, иначе - юзать стандартный cgi.FieldStorage. В этом случае ничего и никуда копировать не пришлось бы. Временный файл создавался бы сразу там, где надо.
axe
o7412369815963
по хорошему нужно загруженный темповый файл перемещать куда надо.
1. Можно ли скопировать файл, если неизвестно, где он находится? (т.е. понятно, что можно сделать write(f.read()), но как-то это не круто)
2. Нельзя ли создать жёсткую ссылку на этот файл? (чтобы копировать не пришлось)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB