繼上篇成功的與服務器端通訊上以後,我如今須要將安卓本地的圖片上傳到服務端。服務端接收圖片存下來。java
參考:https://blog.csdn.net/qq_26906345/article/details/91045074android
Android客戶端:flask
點擊按鈕會將文件上傳到服務器,圖片的地址我暫時是寫死的。服務器
服務器端:app
接收到圖片存儲到寫好的位置ide
相關代碼以下:佈局
Android客戶端:因爲佈局文件只有一個按鈕,故不在此展出。post
MainActivity.java:主要就是設置了對按鈕的監聽。gradle
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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:開啓線程上傳圖片。ui
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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.