[三星]写一个最简单的支持文件上传的WebServer

除了美化之外,还可以来尝试挑战一下任务
回复
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

[三星]写一个最简单的支持文件上传的WebServer

#1

帖子 oneleaf » 2010-05-14 11:49

1 任务内容: 使用任何语言或脚本,写一个最简单的支持文件上传的WebServer。

2 任务的难度: 三星

3 任务的目的: 学习 Linux 下编程

4 任务所涉及的软件: 任何语言

5 任务将大致消耗的时间: 1天
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [三星]写一个最简单的支持文件上传的WebServer

#2

帖子 oneleaf » 2010-05-14 11:53

:em01 抛砖引玉

代码: 全选

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# (c) UbuntuChina, http://www.ubuntu.org.cn
# (c) free software, GPLv3
# Connect: oneleaf@gmail.com

import BaseHTTPServer,SocketServer, cgi
from os import curdir,sep, path

uploadhtml='''<html><body>
<p>批量文件上传</p>
<form enctype="multipart/form-data" action="/" method="post">
<p>File: <input type="file" name="file1"></p>
<p>File: <input type="file" name="file2"></p>
<p>File: <input type="file" name="file3"></p>
<p>File: <input type="file" name="file4"></p>
<p>File: <input type="file" name="file5"></p>
<p><input type="submit" value="上传"></p>
</form>
</body></html>'''

class WebHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path=='/':
           self.send_response(200)
           self.send_header('Content-Type','text/html; charset=utf-8')
           self.end_headers()
           self.wfile.write(uploadhtml)
           return
        try:
           f = open(curdir+sep+self.path)
           self.send_response(200)
           self.end_headers()
           self.wfile.write(f.read())
           f.close()
        except IOError:
            self.send_error(404,'File Not Found: %s' % self.path)

    def do_POST(self):
        form = cgi.FieldStorage(fp=self.rfile,headers=self.headers,environ={'REQUEST_METHOD':'POST','CONTENT_TYPE':self.headers['Content-Type'],})
        self.send_response(200)
        self.send_header('Content-Type','text/html; charset=utf-8')
        self.end_headers()
        self.wfile.write('<Html>上传完毕。<br/><br/>');
        self.wfile.write('客户端: %s<br/>' % str(self.client_address))
        for field in form.keys():
            field_item = form[field]
            if field_item.filename:
                fn=curdir+sep+field_item.filename
                if path.exists(fn):
                   self.wfile.write('文件 <a href="%s">%s</a> 已经存在,忽略上传。<br/>' % (field_item.filename,field_item.filename))
                else:
                   upfile=open(fn,'w')
                   file_data=field_item.file.read()
                   upfile.write(file_data);
                   upfile.close()
                   file_len = len(file_data)
                   del file_data
                   self.wfile.write('文件 <a href="%s">%s</a> 成功上传,尺寸为:%d bytes<br/>' % (field_item.filename,field_item.filename,file_len))
        self.wfile.write('</html>')


class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): pass

if __name__ == '__main__':
    server_address = ('0.0.0.0', 8080)
    httpd = ThreadingHTTPServer(server_address, WebHandler)
    print "Web Server On %s:%d" % server_address
    httpd.serve_forever()
运行后,在网页访问 http://127.0.0.1:8080 测试
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [三星]写一个最简单的支持文件上传的WebServer

#3

帖子 eexpress » 2010-05-14 12:33

机器没问题。手机连,显示的是“Uploads Disabled”。浏览器启用了js。
● 鸣学
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [三星]写一个最简单的支持文件上传的WebServer

#4

帖子 oneleaf » 2010-05-14 13:04

应该是手机的浏览器禁止了upload
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [三星]写一个最简单的支持文件上传的WebServer

#6

帖子 eexpress » 2010-05-14 15:08

perl -MHTTP::Server::Simple -e 'HTTP::Server::Simple->new->run'
谁会it的,会cgi的,也写一个。我在边上打气。
或者叶子出一个基于那cherokee的方法教程 。 :D
● 鸣学
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: [三星]写一个最简单的支持文件上传的WebServer

#7

帖子 rgwan » 2011-02-16 15:32

eexpress 写了:perl -MHTTP::Server::Simple -e 'HTTP::Server::Simple->new->run'
谁会it的,会cgi的,也写一个。我在边上打气。
或者叶子出一个基于那cherokee的方法教程 。 :D
PHP也一样~用nginx写
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
gpgkd906
帖子: 23
注册时间: 2011-01-04 11:49

Re: [三星]写一个最简单的支持文件上传的WebServer

#8

帖子 gpgkd906 » 2011-07-30 8:49

这个不是依然用的http类库么
我还以为是指用socket直接监听端口,然后实现基本的request和response,额外再加上一个文件上传。
看任务的意思,连上传文件的界面都没要求,所以连http协议都不需要实现的,主要就是一个unix/socket编程。
看来是我多想了。
caochao
帖子: 7
注册时间: 2012-04-18 22:04

Re: [三星]写一个最简单的支持文件上传的WebServer

#9

帖子 caochao » 2012-04-22 19:48

看了楼主的代码,我觉得自己想多了。
回复