2009-02-18 2 views
0

Я запускаю python 2.4 из cgi, и я пытаюсь загрузить в облачный сервис с помощью api python. В php массив $ _FILE содержит элемент «tmp», в котором находится файл, пока вы не разместите его там, где хотите. Что эквивалентно в python?Загрузка python - где tmp/FILES?

если я сделаю это

fileitem = form['file'] 

fileitem.filename это имя файла

если я печатать fileitem, массив просто содержит имя файла и что выглядит сам файл.

Я пытаюсь передать вещи, и для этого требуется место tmp при использовании php api.

ответ

2

Файл является реальным файлом, но cgi.FieldStorage отсоединил его, как только он был создан, чтобы он существовал только до тех пор, пока вы держите его открытым и больше не имеет реального пути к файловой системе.

Вы можете, однако, изменить это ...

Вы можете расширить cgi.FieldStorage и заменить метод make_file поместить файл туда, куда вы хотите:

import os 
import cgi 

class MyFieldStorage(cgi.FieldStorage): 
    def make_file(self, binary=None): 
     return open(os.path.join('/tmp', self.filename), 'wb') 

Вы должны также иметь в виду, что FieldStorage объект только создает реальный файл, если он recieves более 1000B (в противном случае это cStringIO.StringIO)

EDIT: cgi модуль фактически делает файл с модулем tempfile, поэтому проверьте это, если вы хотите много деталей для gooey.

+0

Я не обязательно хочу изменить способ работы с файлами, но когда я пытаюсь записать содержимое файла в кусках, он отлично работает для небольших текстовых файлов, но любое видео или изображения загружаются поврежденными. Я думал, что это может быть решено путем потоковой передачи его, поскольку php api делает – seans

+0

Если вы хотите передать его, вы можете вернуть объект с функцией записи, чтобы принимать данные из Field Storage по мере их получения. Это то, что я делаю, чтобы получить информацию о ходе загрузки AJAX обратно в браузер для одного из моих проектов. –

+0

Я пытаюсь получить файлы в контейнере облака cdn, поэтому «поток» должен произойти в соответствии с их api. Мне нравится ваше предложение переопределить FieldStorage, но сейчас это не работает для меня. Я вроде как новичок в python и может пропустить что-то простое. – seans

1

Вот фрагмент код, взятый с моего сайта:

h = open("user_uploaded_file", "wb") 
while 1: 
    data = form["file"].file.read(4096) 
    if not data: 
     break 
    h.write(data) 
h.close() 

Надеется, что это помогает.

Смежные вопросы