Android客户端与Python服务器端通信之上传图片
Posted glam
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android客户端与Python服务器端通信之上传图片相关的知识,希望对你有一定的参考价值。
继上篇成功的与服务器端通信上之后,我现在需要将安卓本地的图片上传到服务端。服务端接收图片存下来。
参考:https://blog.csdn.net/qq_26906345/article/details/91045074
Android客户端:
点击按钮会将文件上传到服务器,图片的地址我暂时是写死的。
服务器端:
接收到图片存储到写好的位置
相关代码如下:
Android客户端:由于布局文件只有一个按钮,故不在此展出。
MainActivity.java:主要就是设置了对按钮的监听。
package com.example.vesper.uploadpic; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.io.File; public class MainActivity extends AppCompatActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { File f=new File(Environment.getExternalStorageDirectory().getPath()+"/mahc/image/1573125250817.jpg"); try { ImageUpload.run(f); } catch (Exception e) { e.printStackTrace(); } } }); } }
ImageUpload.java:开启线程上传图片。
1 package com.example.vesper.uploadpic; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import okhttp3.MediaType; 7 import okhttp3.MultipartBody; 8 import okhttp3.OkHttpClient; 9 import okhttp3.Request; 10 import okhttp3.RequestBody; 11 import okhttp3.Response; 12 13 public class ImageUpload{ 14 15 private static final MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpg"); 16 private static final OkHttpClient client = new OkHttpClient(); 17 public static void run(File f) throws Exception { 18 final File file=f; 19 new Thread() { 20 @Override 21 public void run() { 22 //子线程需要做的工作 23 RequestBody requestBody = new MultipartBody.Builder() 24 .setType(MultipartBody.FORM) 25 .addFormDataPart("file","1.jpg", 26 RequestBody.create(MEDIA_TYPE_JPG, file)) 27 .build(); 28 //设置为自己的ip地址 29 Request request = new Request.Builder() 30 .url("http://192.168.xxx.xxx:5000/upload") 31 .post(requestBody) 32 .build(); 33 try(Response response = client.newCall(request).execute()){ 34 if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 35 36 System.out.println(response.body().string()); 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41 }.start(); 42 } 43 }
Python服务器端:
uploadserver.py:
1 #-*-coding:utf-8-*- 2 from flask import Flask 3 from flask import request 4 import cv2 5 import os 6 from werkzeug.utils import secure_filename 7 app = Flask(__name__) 8 basedir=os.path.abspath(os.path.dirname(__file__)) 9 10 @app.route(\'/\') 11 def test(): 12 return \'服务器正常运行\' 13 14 #此方法接收图片 15 @app.route(\'/upload\',methods=[\'POST\']) 16 def upload(): 17 f = request.files[\'file\'] 18 print(\'连接成功\') 19 # 当前文件所在路径 20 basepath = os.path.dirname(__file__) 21 upload_path = os.path.join(basepath, \'1115\', secure_filename(f.filename)) 22 # 保存文件 23 f.save(upload_path) 24 return \'保存成功\' 25 26 if __name__ == \'__main__\': 27 app.run(host=\'0.0.0.0\')
遇到的问题:
1.读文件权限要在Manifest.xml中加上:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2.在gradle中修改最小SDK为19.
以上是关于Android客户端与Python服务器端通信之上传图片的主要内容,如果未能解决你的问题,请参考以下文章
Android客户端采用Http 协议Post方式请求与服务端进行数据交互
一起Talk Android吧(第二百九十五回:Android中的BLE开发:客户端与服务端通信一)