日常工作中,主要是通过ssh终端(putty等)远程开发,经常涉及到传输文件,因为本地系统为Win10,所以没办法利用强大的linux脚本来进行文件传输。之前用过python的SimpleHttp模块写了一个简单的文件服务器(http://www.cnblogs.com/sxhlinux/p/6694904.html),但是缺少GUI,且仍然依赖curl等相关命令。所以,就想着写一个简单的http文件服务器,满足普通的文件上传、下载文件。
        代码采用python 3.4版本,结构如下

代码如下

#### server.py ####

#!/usr/bin/python3

import sys
from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler if __name__ == '__main__':
try:
handler = CGIHTTPRequestHandler
handler.cgi_directories = ['/cgi-bin', '/htbin']
port = int(sys.argv[1])
print('port is %d'% port)
server = HTTPServer(('', port), handler)
print('Welcome to my website !')
server.serve_forever() except KeyboardInterrupt:
print ('^C received, shutting down server')
server.socket.close()

#### index.html ####

<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
<title>File Server</title>
</head>
<body>
<form action="/cgi-bin/download.py" method="get">
要下载的文件: <input type="text" name="filename" />
<input type="submit" value="download">
</form> <form enctype="multipart/form-data" action="/cgi-bin/upload.py" method="post">
要上传的文件: <input type="file" name="filename" />
<input type="submit" value="upload">
</form>
</body>
</html>

#### download.py ####

#!/usr/bin/python3

import os
import sys
import cgi form = cgi.FieldStorage() filename = form.getvalue('filename') dir_path = "/home/sxhlinux/data/"
target_path = dir_path + str(filename)
if os.path.exists(target_path) == True:
print ('Content-Type: application/octet-stream')
print ('Content-Disposition: attachment; filename = "%s"' % filename) sys.stdout.flush()
fo = open(target_path, "rb")
sys.stdout.buffer.write(fo.read())
fo.close()
else:
print("""\
Content-type: text/html\n
<html>
<head>
<meta charset="utf-8">
<title>File server</title>
</head>
<body>
<h1> %s doesn't exist in the server:
files in the server list below: </h1>""" % filename) for line in os.popen("ls -lh ~/data/"):
name = line.strip().split(' ', 8)
if len(name) == 9:
print('''<form action="/cgi-bin/download.py" method="get">
%s <input type="submit" name="filename" value="%s">
</form>''' % (line, name[8])) print('</body> <html>')

#### upload.py ####

#!/usr/bin/python3

import cgi, os

form = cgi.FieldStorage()

item = form['filename']

if item.filename:
fn = os.path.basename(item.filename)
open('/home/sxhlinux/data/' + fn, 'wb').write(item.file.read())
msg = 'File ' + fn + ' upload successfully !'
else:
msg = 'no file is uploaded ' print("""\
Content-type: text/html\n
<html>
<head>
<meta charset="utf-8">
<title>Hello world</title>
</head>
<body>
<h2>名称: %s</h2>
</body>
<html>
""" % (msg,))
将上述代码按照前面的目录结构放好,然后执行命令 nohup /usr/bin/python3 server.py 8001 >/dev/null &  启动文件服务端,监听8001端口,远程可以在浏览器中 输入 http://SERVER_ADDR:8001 来访问该文件服务器进行相关的文件上传下载操作。
 
注:附件中是整个demo的代码(download.py,upload.py两个文件中的目录路径 /home/sxhlinux/data 需要改成自己要存储文件的文件夹路径),有兴趣的小伙伴可以下载修改,刚学习python,欢迎大家多多提意见。
 

简单http文件服务器的更多相关文章

  1. nginx安装及配置为简单的文件服务器

    centos 6.5 直接yum安装即可 yum install nginx -y 配置文件位于:/etc/nginx/nginx.conf,里面可以修改处理器数量.日志路径.pid文件路径等,默认的 ...

  2. 使用socket编程实现一个简单的文件服务器

    使用socket编程实现一个简单的文件服务器.客户端程序实现put功能(将一个文件从本地传到文件服务器)和get功能(从文件服务器取一远程文件存为本地文件).客户端和文件服务器不在同一台机器上. pu ...

  3. Nginx|构建简单的文件服务器(mac) 续-FastDFS安装(mac)|文件存储方案

    目录 Nginx|构建简单的文件服务器(mac) 1 所需安装包 2 安装fastdfs-nginx-module-master 3 安装Nginx Nginx|构建简单的文件服务器(mac) 续上文 ...

  4. Nginx之使用nginx搭建简单的文件服务器

    使用nginx可以搭建简单文件服务器 安装nginx(不详述) 修改配置文件 /usr/local/nginx/conf/nginx.conf user root; /usr/local/nginx/ ...

  5. [Nodejs]十分钟快速编写简单静态文件服务器

    学了几天Nodejs 后我又干上了前端的活.这次遇到的问题是,我想在不同的设备上方便的查看我编写的网页,很自然的就想到要是能在本地搭建一个简单的http服务器的话,那局域网内的所有设备都可以访问了,这 ...

  6. python搭建简单http文件服务器

    import SimpleHTTPServer import SocketServer PORT = 8000 Handler = SimpleHTTPServer.SimpleHTTPRequest ...

  7. 无敌简单快速的文件服务器sgfs

    前言 想要构建一个Linux文件服务器?看看下面几个要求是不是你想要的? 1.只需要单节点部署就够了 2.部署启动简单,下载之后,一键启动,一键关闭 3.不需要任何其他的依赖安装,而且运行时占用内存资 ...

  8. 使用Go开发一个简单的服务器程序

    最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...

  9. nginx配置静态文件服务器

    搭建文件服务器 要点就是root目录,会自动指向索引文件 如: index, index.html等 server { client_max_body_size 4G; listen 80; ## l ...

随机推荐

  1. MyBatis之基于XML的动态SQL

    先说下我的梦想,大学的时候一直想着是能开店卖胡辣汤,到目前依然还是我的梦想,上周一家出版社联系我问我有没有时间可以合作出书,这也是我的梦想之一,想了想还是放弃了,至少觉得目前不行,毕竟工作还不到五年, ...

  2. hasResultError

    hasResultError 的作用是 让返回的对象可以报错误信息.

  3. mysql 中文乱码

  4. 解决 vmware workstations 14 开启虚拟机黑屏

    某些朋友在使用vmware workstations 14创建或者开启虚拟机时发现黑屏,但其实系统的正常启动的,只是无画面显示. 1.以管理员方式启动命令行 2.修复LSP 在CMD中输入 netsh ...

  5. designed principle

    Review Of designed Pattern principle OutLine: Explanation in principles of designed pattern and usef ...

  6. Java this 关键字的用法

    this 关键字的用法 this 在类中就是代表当前对象,可以通过 this 关键字完成当前 对象的成员属性.成员方法和构造方法的调用. 那么何时用 this? 当在定义类中的方法时,如果需要调用该类 ...

  7. mysql的水平拆分和垂直拆分

    转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从 ...

  8. python_斐波那契数列

    什么是斐波那契数列? -- 一组第从第三个值开始,每个值都等于前两个值之和的一种有意思的数列 如[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 如何用程序进行实现? -- 逻辑整 ...

  9. 【转】wget

    wget 下载整个网站,或者特定目录 需要下载某个目录下面的所有文件.命令如下 wget -c -r -np -k -L -p www.xxx.org/pub/path/ 在下载时.有用到外部域名的图 ...

  10. 【转】IGS相关

    目 前,全球260多个lGS跟踪站中,我国占20多个,分布在武汉.拉萨.乌鲁木齐.昆明.上海等地,全球IGS网的GPS数据,由单台接收机交换 (RINEX)格式生成的日观测和导航数据文件组成,其存储方 ...