Можно ли загружать файлы с помощью Python SimpleHTTPServer или cgi?

Я хотел бы иметь простую веб-страницу, на которой пользователь может загружать файлы. Какой будет самый простой способ сделать это.

Я знаю, как начать SimpleHTTPServer, но я не знаю, как я могу загружать файлы с помощью SimpleHTTPServer. Я даже не знаю, возможно ли это.

Я нашел код для загрузки файлов с помощью cgi, но если я запустил этот код в командной строке, он просто печатает мне HTML-код на экране.

Ответ 1

Я все еще новичок в Python и пробовал использовать тот же код, который вы добавили в свой пост. Единственная проблема заключается в том, что он позволяет загружать только один файл. Я хотел загрузить несколько файлов за раз.

Используя все еще доступный код, найденный здесь, вы можете заменить метод deal_post_data следующим образом:

    form = cgi.FieldStorage(
    fp=self.rfile,
    headers=self.headers,
    environ={'REQUEST_METHOD':'POST'})

    self.send_response(200)
    self.end_headers()

    saved_fns = ""

    try:
        if isinstance(form['file'], list):
            for f in form['file']:
                print f.filename
                saved_fns = saved_fns + ", " + f.filename
                self.save_file(f)
                self.wfile.write(f.value)
        else:
            f = form['file']
            self.save_file(f)
            saved_fns = saved_fns + f.filename
            self.wfile.write(f.value)
        return (True, "File(s) '%s' upload success!" % saved_fns)
    except IOError:
        return (False, "Can't create file to write, do you have permission to write?")

Затем добавьте следующую функцию для сохранения загруженного файла:

def save_file(self, file):
    outpath = os.path.join("", file.filename)
    with open(outpath, 'wb') as fout:
        shutil.copyfileobj(file.file, fout, 100000)

Наконец, измените форму html, чтобы одновременно загружать несколько файлов, используя тег multiple во вставленном HTML.

Я только что закончил тестирование, и он отлично работает.

Надеюсь, что это полезно

Ответ 2

Да, SimpleHTTPServer может получать http-загрузки с правильным обработчиком запросов.

По сути, вам нужно определить метод do_POST, в котором форма или что-то подобное загружает данные. загрузка затем читается из self.rfile.

class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
     # ...
     def do_POST(self):
         for line in self.rfile:
             # do something with the line
             print line

конечно, если вы хотите загрузить из браузера, вам нужно иметь форму где-то, что отправляет на http-сервер:

<form enctype="multipart/form-data" method="post" action="http://hostname.of.server:8080/">
  <input name="file" type="file"/>
  <input type="submit" value="upload"/>
</form>

Более подробную информацию, в частности о том, как анализировать необработанные данные из данных формы, можно найти в ссылках, опубликованных в качестве комментариев к вопросу.