前段时间翻译了FutureStudio的Retrofit2教程,从中学习了一些Retrofit2的使用方法。如果你打算最近开始学习,我的博客上有一个Retrofit教程。或许你可以参考以下内容:Retrofit教程。本文作为阶段性总结,将使用Python中的Flask框架实现Android端的多文件上传功能。读者没用过Python中的Flask也没关系,只能看Android客户端部分,毕竟客户端工程师只用API也是可以的。一、实验结果Android端操作截图服务器端接收到的图片二、服务器端实战服务器端负责接收并保存客户端上传的图片,并提供访问图片的能力。第三方库的语言,有很多web服务框架,如Flask、Django等,笔者使用的是Flask框架。Flask是一个微型框架。实现小功能非常方便。作者实现的多文件上传功能不超过30行。让我们详细看一下。2.1环境安装笔者使用的Python版本是3.4,大家可以去Python3.4下载,选择适合自己系统的版本下载。请搜索完整的Python教程。Python安装完成后,需要安装服务端程序依赖库。通过pip安装:pipinstallFlaskpipinstallwerkzeug2.2程序实现首先要引入依赖库:fromflaskimportFlask,request,send_from_directory,jsonifyimportosfromwerkzeugimportsecure_filename本实验需要上传文件,需要限制上传文件的文件类型和文件名,防止某些程序破坏server运行,以及一些非法文件名如:filename="../../../../home/username/.bashrc"如果黑客能够操作此类文件,将对服务器系统造成致命打击.所以werkzeug提供了secure_filename来验证上传文件文件名的合法性。判断文件后缀是否合法ALLOWED_EXTENSIONS=set(['png','jpg','jpeg','gif'])defallowed_file(filename):return'.'infilenameandfilename.rsplit('.',1)[1]在ALLOWED_EXTENSIONS接收上传文件的函数代码如下:@app.route('/upload',methods=['POST'])defupload_file():ifrequest.method=='POST':forkinrequest.files:file=request.files[k]image_urls=[]iffileandallowed_file(file.filename):filename=secure_filename(file.filename)file.save(os.path.join(app.config['IMAGE_FOLDER'],filename))image_urls.append("images/%s"%filename)returnjsonify({"code":1,"image_urls":image_urls})Flask支持GET、POST、PUT、DELETE等HTTP请求方式,并使用装饰器进行修饰,类似Java中的注解概念,/upload是客户端请求的相对地址,请求方式仅限于POST。根据request内置对象,可以访问客户端发送的文件,查看文件并保存到本地,其中image_urls是上传图片的相对地址数组。***将图片的地址以json格式返回给客户端。完整的服务端代码如下:fromflaskiimportFlask,request,send_from_directory,jsonifyimportosfromwerkzeugimportsecure_filenameapp=Flask(__name__)app.config['IMAGE_FOLDER']=os.path.abspath('.')+'\\images\\'ALLOWED_EXTENSIONS=set(['png','jpg','jpeg','gif'])defalowed_file(文件名):return'.'infilenameandfilename.rsplit('.',1)[1]inALLOWED_EXTENSIONS@app.route('/upload',methods=['POST'])defupload_file():ifrequest.method=='POST':forkinrequest.files:file=request.files[k]print(file)image_urls=[]iffileandallowed_file(file.filename):filename=secure_filename(file.filename)file.save(os.path.join(app.config['IMAGE_FOLDER'],filename))image_urls.append("images/%s"%filename)returnjsonify({"code":1,"image_urls":image_urls})#让文件映射访问,否则默认只能访问static文件夹下的文件@app.route("/images/ScreateService(ClassserviceClass){Retrofitretrofit=builder.client(httpClient.build()).build();returnretrofit.create(serviceClass);}}具体的API操作由FlaskClient接口操作,publicinterfaceFlaskClient{//上传图片@Multipart@POST("/upload")Call
