LINUX.ORG.RU

Как быстро передать файл в apache cgi?

 , ,


0

2

День добрый. Пытаюсь передать с помощью httplib файл в apache cgi.

Клиент:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
import httplib
import sys

conn = httplib.HTTPConnection("127.0.0.1")
file = open("in.zip")

seek_data = 0
data = file.read(4096)
while data:
  conn.connect()

  size_data = sys.getsizeof(data)
  struct = {'seek': seek_data, 'data': data}
  encode_data = urllib.urlencode(struct)
  seek_data += size_data

  conn.request("POST", "/", encode_data)
  response = conn.getresponse()
  conn.close()

  data = file.read(4096)

Сервер:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# enable debugging

import cgitb
import sys
import os
import urlparse

cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"

str = ''
for char in sys.stdin.readline():
  str += char

pars = urlparse.parse_qs(str)
data_block = pars['data'][0]
seek_block = pars['seek'][0]
size_data = sys.getsizeof(data_block)

if int(seek_block) == 0:
  if os.path.exists('out.zip'):
    os.remove('out.zip')
  dumped = open('out.zip', 'wb')
else:
  dumped = open('out.zip', 'a')

dumped.seek(int(seek_block), 0)
dumped.write(data_block)

Проблема в том, что процесс идёт очень долго. Как я понимаю, причина в открытии и закрытии соединения (иначе POST не работает). Увеличение размера чтения файла, результата не даёт.

Есть ли способ передать в apache cgi поток данных (из файла например) быстрее, чем через POST.

Заранее спасибо.

★★★★★

Последнее исправление: cyclon (всего исправлений: 1)

Ты какой-то ужас делаешь! Зачем 100500 раз соединение устанавливать? 1 раз в самом начале соединяешься и передаешь файл блоками. На сервере файл принимаешь.

Делал такое я когда-то, но до ума не довел (за ненадобностью).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Зачем 100500 раз соединение устанавливать?

Traceback (most recent call last):
  File "client.py", line 25, in <module>
    response = conn.getresponse()
  File "/usr/lib/python2.7/httplib.py", line 1033, in getresponse
    raise ResponseNotReady()
httplib.ResponseNotReady
cyclon ★★★★★
() автор топика
Последнее исправление: cyclon (всего исправлений: 1)

Кстати, а при чем здесь апач, если и клиент, и сервер на питоне написаны? Просто сокет открыть и файл туда вбухать нельзя?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cyclon

Доступ в мир только через apache, разве есть способ «перехватить» сокет апача?

блджат, откуда я знаю, что и как там у вас понастроено. Вообще-то apache умеет правильно прокидывать соединения через запрос CONNECT.

и кстати почитайте уже протокол HTTP, раз пишете клиент и сервер.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Возможно кто нибудь приведет пример с использованием питона? Ничего нормального нагуглить не смог, только прокси.

HTTP у меня только из-за апача.

cyclon ★★★★★
() автор топика
Последнее исправление: cyclon (всего исправлений: 1)
Ответ на: комментарий от cyclon

Странно то, что загрузка файла из браузера, которая использует то же POST, гараздо быстрее (в 100 раз, на глаз).

#!/usr/bin/env python
import cgi, os
import cgitb; cgitb.enable()

try: # Windows needs stdio set for binary mode.
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode (1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

form = cgi.FieldStorage()

# A nested FieldStorage instance holds the file
fileitem = form['file']

# Test if the file was uploaded
if fileitem.filename:
   
   # strip leading path from file name to avoid directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open(fn, 'wb').write(fileitem.file.read())
   message = 'The file "' + fn + '" was uploaded successfully'
   
else:
   message = 'No file was uploaded'
   
print """\
Content-Type: text/html\n
<html><body>
<p>%s</p>
</body></html>
""" % (os.environ,)

взял из интернетов.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Блин, решение было на поверхности. Всем спасибо.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.