Форум сайта python.su
Пробую загрузить файл под mod_wsgi. В качестве фрэймвёрка bottle.
Получаю все данные POST и GET и сохраняю их в один словарь:
@route( '/' )
@route( '/', method='POST' )
def main():
args = dict( request.GET.items())
args.update( dict( request.POST.items()) )
req_data = FieldStorage(req, True, file_callback=Storage)
Офлайн
там тот же FieldStorage, в ботле он завернут внутрь и управляется через request.POST
Офлайн
я файлики загружаю с пом. 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)
Офлайн
o7412369815963я сомневаюсь, потому что:
там тот же FieldStorage, в ботле он завернут внутрь и управляется через request.POST
from mod_python.util import FieldStorage
Офлайн
О, нашёл. mod_python → FieldStorage:
Access to form data is provided via the FieldStorage class. This class is similar to the standard library module cgi FieldStorage.т.е. просто похожи.
Офлайн
из кода bottle:
data = cgi.FieldStorage(fp=fb, environ=safe_env, keep_blank_values=True)
Офлайн
Вопрос всё же остаётся. Можно ли повлиять (на bottle?), чтобы временные файлы сразу складывались в нужную директорию? Хотя и имена было бы полезно переопределять.
Ещё был бы полезен некоторый анализ загружаемого файла перед загрузкой - определить тип/название/размер, но это уже по возможности.
Офлайн
axeлучше не в нужную директорию, а получить имя файла для того что-б его переместить. я с этим ещё не разобрался, хотя тоже интересует.
Вопрос всё же остаётся. Можно ли повлиять (на bottle?), чтобы временные файлы сразу складывались в нужную директорию? Хотя и имена было бы полезно переопределять.
Ещё был бы полезен некоторый анализ загружаемого файла перед загрузкой - определить тип/название/размер, но это уже по возможности.
Офлайн
В классе наследнике (от FieldStorage) мог бы быть переопределён метод make_file, определяющий создание временных файлов.
Но в bottle безоговорочно прописано использование стандартного cgi.FieldStorage. А можно было бы указать какой-нибудь if, типа если пришёл переопределённый класс, то использовать его, иначе - юзать стандартный cgi.FieldStorage. В этом случае ничего и никуда копировать не пришлось бы. Временный файл создавался бы сразу там, где надо.
Отредактировано (Июль 27, 2010 14:02:18)
Офлайн
o74123698159631. Можно ли скопировать файл, если неизвестно, где он находится? (т.е. понятно, что можно сделать write(f.read()), но как-то это не круто)
по хорошему нужно загруженный темповый файл перемещать куда надо.
Отредактировано (Июль 27, 2010 15:03:10)
Офлайн