使用python cgi上传文件并计算m

2023-01-31 02:01:51 python 计算 上传文件

对文件拷贝后进行MD5值比较,看是不是拷贝完全。Google和baidu上都是使用md5模块读取所有的文件进内存,在计算md5,导致计算超过1G大小的文件报错。增量计算MD5的方法:

#!/usr/bin/python
import hashlib
import sys
def main():
        if len(sys.argv) != 2:
                sys.exit('usage:%s file' % sys.argv[0])
        filename = sys.argv[1]
        md5 = hashlib.md5()
        with open(filename,'rb') as fp:
                while True:
                        blk = fp.read(4096)
                        if not blk:break
                        md5.update(blk)
        print md5.hexdigest(),filename

if __name__ == '__main__':
        main()


这个效果一样,使用md5,上面使用的hashlib:

#!/usr/bin/Python
import md5
import sys
def main():
        if len(sys.argv) != 2:
                sys.exit('usage:%s file' % sys.argv[0])
        filename = sys.argv[1]
        m = md5.new()
        with open(filename,'rb') as fp:
                while True:
                        blk = fp.read(4096)
                        if not blk:break
                        m.update(blk)
        print m.hexdigest(),filename

if __name__ == '__main__':
        main()


——————————————————分割线——————————————————


上面例子的应用

计算上传文件的md5值,并显示文件大小:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import cgi, os
import cgitb; cgitb.enable()
import md5

fORM = cgi.FieldStorage()

fileitem = form['filename']
if fileitem.filename:
    #fn = os.path.basename(fileitem.filename)
    #open('/tmp/' + fn, 'wb').write(fileitem.file.read())
    message = 'Got file %s"' % cgi.escape(fileitem.filename)
    m = md5.new()
    size = 0
    while True:
        data = fileitem.file.read(4096)
        if not len(data):
            break
        size += len(data)
        m.update(data)
    #open('/tmp/' + fn, 'wb').write(data)
    li = 'Received file of %d bytes. MD5sum is %s' % (size,m.hexdigest())

else:
    message = 'No file was uploaded'

print """\
Content-Type: text/html\n
<html>
<body>
   <p>%s</p>
   <p>%s</p>
</body>
</html>
""" % (message,li)

MD5.html:

<html>
<body>
   <form enctype="multipart/form-data" 
                     action="/op/md5_file.py" method="post">
   <p>File: <input type="file" name="filename" /></p>
   <p><input type="submit" value="md5" /></p>
   </form>
</body>
</html>


效果:

wKioL1RsK4Xx88r2AACFvwfYywc863.jpg

点击md5,计算文件的md5值

wKiom1RsK2OCDLXYAADh6gKnso8100.jpg

——————————————————分割线——————————————————


跟上个例子类似,功能不一样

python cgi上传文件:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# 获取文件名
fileitem = form['filename']

# 检测文件是否上传
if fileitem.filename:
   # 设置文件路径 
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + 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>
""" % (message,)

index.html

<html>
<body>
   <form enctype="multipart/form-data" 
                     action="/op/save_file.py" method="post">
   <p>File: <input type="file" name="filename" /></p>
   <p><input type="submit" value="Upload" /></p>
   </form>
</body>
</html>

效果:

wKiom1RsKXKBRoclAABjPviMZIw179.jpg

点击Upload,显示上传成功

wKiom1RsKcCST4L7AACTALCJiW8111.jpg


相关文章