Публикация только части файла с помощью кода Python - PullRequest
0 голосов
/ 17 февраля 2012

Используя модуль poster.encode, это работает, когда я публикую весь файл в Solr:

f = open(filePath, 'rb')
datagen, headers = multipart_encode({'file': f})

# use wt=json because it's more convenient to navigate    
request = urllib2.Request(SOLR_BASE_URL + 'update/extract?extractOnly=true&extractFormat=text&indent=true&wt=json', datagen, headers)   # assumes solrPath ends in '/'
extracted = urllib2.urlopen(request).read()

Однако для некоторых файлов я хотел бы отправить только первые n байтов файлов. Я думал, что это будет работать:

f = open(filePath, 'rb')    
mp = MultipartParam('file', fileobj=f, filesize=f)
datagen, headers = multipart_encode({'file': mp})

# use wt=json because it's more convenient to navigate    
request = urllib2.Request(SOLR_BASE_URL + 'update/extract?extractOnly=true&extractFormat=text&indent=true&wt=json', datagen, headers)   # assumes solrPath ends in '/'
extracted = urllib2.urlopen(request).read()

... но я получаю запрос на тайм-аут (и странно, что мне нужно перезапустить apache, прежде чем запросы в мое приложение web2py снова заработают). Я получаю сообщение об ошибке «http 400 content missing» от urlopen (), когда я опускаю аргумент размер файла. Я просто неправильно использую MultipartParam?

(Смысл всего этого в том, что я использую Solr для извлечения текстового содержимого и метаданных из файлов. Для видео и аудио файлов я хотел бы избежать отправки только первых 100-300 тыс. предположительно все соответствующие данные находятся в заголовках файлов.)

1 Ответ

1 голос
/ 18 февраля 2012

Причина, по которой у вас возникают проблемы, заключается в том, что кодировка MIME вводит часовых в посте, если вы не укажете размер файла - это означает, что вам нужно сделать кодирование частичной передачи , чтобы веб Сервер знает, когда прекратить чтение файла. Но это другая проблема - если вы перестанете отправлять POST в MIME-кодировке в промежуточный поток сервера, он просто будет ждать завершения блока. Chunked transfer encoding и mixed-multipart mime encoding оба крайне серьезны, когда дело доходит до размеров сегмента сообщения.

Если вы хотите отправить только 100-300 КБ данных, а затем только прочитать столько, то каждое сообщение, которое вы делаете на сервере, будет заканчиваться тем байтом, который вы хотите, и веб-сервер ожидает.

...