当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2010-05-14 11:49 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10149
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 130
1 任务内容: 使用任何语言或脚本,写一个最简单的支持文件上传的WebServer。

2 任务的难度: 三星

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

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

5 任务将大致消耗的时间: 1天


页首
 用户资料  
 
2 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2010-05-14 11:53 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10149
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 130
: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 测试


页首
 用户资料  
 
3 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2010-05-14 12:33 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
机器没问题。手机连,显示的是“Uploads Disabled”。浏览器启用了js。


_________________
● 鸣学


页首
 用户资料  
 
4 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2010-05-14 13:04 
论坛管理员

注册: 2005-03-27 0:06
帖子: 10149
系统: Ubuntu 12.04
送出感谢: 7
接收感谢: 130
应该是手机的浏览器禁止了upload


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2010-05-14 13:16 
头像

注册: 2009-10-09 12:54
帖子: 989
地址: 北京某胡同
系统: debian
送出感谢: 4
接收感谢: 2
顶一下 :em11


_________________
python写的一个跨平台的聊天软件TChat。支持文件传输。
android防火墙droidwall更新,添加月流量统计功能。有兴趣的点我:D
原创Android社交应用[飘],开源免费!


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2010-05-14 15:08 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
perl -MHTTP::Server::Simple -e 'HTTP::Server::Simple->new->run'
谁会it的,会cgi的,也写一个。我在边上打气。
或者叶子出一个基于那cherokee的方法教程 。 :D


_________________
● 鸣学


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2011-02-16 15:32 
头像

注册: 2009-08-24 19:30
帖子: 264
送出感谢: 1
接收感谢: 1
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


页首
 用户资料  
 
8 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2011-07-30 8:49 

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


页首
 用户资料  
 
9 楼 
 文章标题 : Re: [三星]写一个最简单的支持文件上传的WebServer
帖子发表于 : 2012-04-22 19:48 

注册: 2012-04-18 22:04
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
看了楼主的代码,我觉得自己想多了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译