简易远程文件上传

简介: 后台搭建开心太早另类脚本部署客户端源码核心测试命令清单执行结果总结一直以来,Python的requests库都没能正式的接触到。

一直以来,Python的requests库都没能正式的接触到。今天这么一试,才发现原来是这么的强大。感情之前的urllib, urllib2都没这么的智能。于是思量着做了个小工具, 配合PHP写了一个命令行下的文件上传小工具。


后台搭建

开心太早

由于最后会在命令行里面使用,所以用不着什么花哨的界面(其实是写不出来,╭(╯^╰)╮)。

大致的对比了一下,觉得还是前后端一致的好,然后就尝试着使用Python写文件上传处理的后台逻辑。

东西都写好了,利用Flask优雅的路由,实现的一个不错的后台。然后

http://127.0.0.1:5000/upload

完美! 原来这么简单哦。

然而终究是高兴的太早,让我尝试着让局域网中的同学测试一下帮忙测试一下的时候,发现了这个致命的问题。

http://192.168.···

网段内连接超时。 WTF,然后试了几遍还是不行,后来就看代码,一点点的排查,也没有发现什么错误。后来恍然大悟,需要部署到生产服务器上才行,OMG 忙活半天,把这件事给忘了。

然后也不想写了,确切的说不想用Python写了。

另类脚本

然后对比了一下Java和PHP。果断选择了PHP,不是不会用Java,而是不想搞得那么复杂了,建工程,导包,配环境··· ···

用上PHP就好多了,几个函数就搞定了嘛。(因为是自己用,所以错误检查什么的都没做,实际开发中万万不可这样。)

<?php
$storagepath = isset($_REQUEST['storagepath'])?$_REQUEST['storagepath']: "./upload/";

$filename = $_FILES['file']['name'];
$tempfile = $_FILES['file']['tmp_name'];

if(file_exists($storagepath.$filename)) {
    echo $storagepath.$filename." has existed!"  ;
    return;
}
if(move_uploaded_file($tempfile, $storagepath.$filename)){

    echo "$filename uploaded succeed, and you can see at $storagepath !";
}else{
    echo $_FILES['file']['error'];
    echo "failed!";
}

部署

接下来就是部署到服务器上了。先在本地测试了一下,发现正常。然后就远程登录到阿里云的学生机服务器上了。

当然了,我事先是配好PHP+Apache环境了的。

把这个upload.php文件放到htdoc文件夹下,然后再创建一个upload文件夹(用于存放上传的文件)。

这样就完成了。如果不放心的话,可以先用浏览器测试一下,出现failed就说明部署成功了。
建议验证部署效果

客户端

客户端当然还是用Python了,毕竟今天的主角是requests嘛。

源码

#coding: utf-8

import requests
import argparse

# avoid numbers of http connection 
requests.adapters.DEFAULT_RETRIES = 5
# close urllib3 keep-alive style
s = requests.session()
s.keep_alive = False

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='tool for uploading file.')
    parser.add_argument('url', type=str, help='the server url for handling upload work.')
    parser.add_argument('-f', '--filepath', help='the full file path you want to upload')

    args = parser.parse_args()

    url = args.url
    filepath = args.filepath

    files = {
        'file': open(filepath, 'rb')
    }
    # print url
    # print filepath
    result = requests.post(url, files=files)
    print result.text

核心

可能明眼的你一下就看出来了,核心就这么一行:

result = requests.post(url, files=files)

指定files就好比是在表单中执行了

enctype=”multipart/form-data”

测试

命令清单

关于客户端如何使用,可以使用help命令,便可输出详细的介绍文档。

python client.py -h

如图:
命令清单

按照argparse的使用规范,在命令行中键入相对应的参数即可。

执行

python client.py http://112.74.170.6/upload.php -f Spring.png
如图:
执行命令

结果

然后,远程登录到服务器上,看看到底有没有上传成功吧。

  • 对应客户端的输入命令,上传的文件为Spring.png。

Spring.png

  • 双击验证图片是否损坏

双击验证图片是否损坏

如此,前后端测试通过。

总结

这里对于简单的文件上传做了下实现,对比实际中会用得到的,这个小工具简直不能入眼。不过还是那句话,贵在尝试。

requests在本次的实验中起到了至关重要的作用。但是其包含的远远不止这些,好有好多东西值得我们前去挖掘。往往精彩就在于细节。

学而时习之,学而时思之。

最后,如果对于那个图片上的水印有兴趣的话。可以参照博主前面的那个水印工具制作。
http://blog.csdn.net/marksinoberg/article/details/53363533

如果懒得弄,也可以留下您的邮箱, 与我取得联系。对于分享大业,在下乐意之至。(^__^) 嘻嘻……

目录
相关文章
|
10月前
|
前端开发 Java Apache
文件上传与下载
文件上传与下载 文件上传也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。 文件上传时,对页面的form表单有如下要求: method=“post” 采用post方式提交数据 enctype=“multipart/form-data” 采用multipart格式上传文件 type=“file” 使用input的file控件上传
|
10月前
|
网络协议 Ubuntu 网络安全
【服务器】iPad远程服务器进行开发(下)
【服务器】iPad远程服务器进行开发(下)
322 0
|
10月前
|
移动开发 Ubuntu 网络协议
【服务器】iPad远程服务器进行开发(上)
【服务器】iPad远程服务器进行开发
199 0
|
前端开发
前端下载文件的几种方式
前端下载文件的几种方式
1070 0
|
数据安全/隐私保护 Windows
|
缓存 Java
sevlet实现下载文件功能
希望做一个小板块,实现文件的上传和下载,那么上传实现了,就需要实现下载,阅读了各位的博客总结了一下。在网页中通过超链接是可以访问我的资源的,浏览器不可访问的资源他就会下载到本地,像一些浏览器可以直接访问的如图片,txt文件浏览器会直接打开。这就需要我们在sevlet中统一处理文件下载。
104 0
sevlet实现下载文件功能
|
JavaScript
你真的了解文件上传吗?
你真的了解文件上传吗?
|
前端开发 JavaScript API
我学会了,写一个前端下载文件功能
过去有很多次文件下载的功能,但是都没有记录下来,这次有空就把文件下载的功能从0写一遍,于是就有了这篇文章。 我会从简到难的方式去实现下载功能。从直接下载字符串到简单请求下载文件,最终通过后端返回的文件名来实现动态下载文件。
592 0
我学会了,写一个前端下载文件功能
|
前端开发
文件下载的几种方式
文件下载的几种方式