OkHttp3 上传经Base64编码的图片至 flask 服务器

前言

之前老是在想OkHttp3 发图片到服务器,因为我要发的是DNG格式的图片,MIMIE没有相应的类型图片,想了想通过Base64编码即可发送即可。Android端写测试代码太麻烦,全都要结合Gui界面写,无形间增加了工作量,所以OkHttp3通过导jar包的方法,在IntelliJ写,不用写那么多,又好理解。
之前还陷入一个误区,发文件就要用OkHttp3的MultipartBody,实际上好像不要,key-value就可以了,服务端读取request设定的key值相应的value就行了。okhttp 上来就是各种设计模式的方法,适应起来真是不容易。

代码

github

客户端

okhttptest.java

import utils.addform_body;

public final class okhttptest {
    public static void main (String...args) throws Exception{
        new addform_body().run();
    }
}

addform_body.java

package utils;

import okhttp3.*;

import java.io.IOException;
import java.util.Objects;
import java.util.UUID;


public class addform_body {
    final String SERVER_URL = "http://127.0.0.1:5000/receive";
//    private static final MediaType MEDIA_TYPE_OSTREAM = MediaType.parse("application/octet-stream");
    private OkHttpClient client = new OkHttpClient();


    public void run() throws Exception{
        String send = new base64_test("C:\\编程\\java\\okhttp-test\\src\\source\\test.DNG").Encode_To_Base64();
        String uuid = UUID.randomUUID().toString();//保证没有重复
        String filename =uuid+".DNG";
        RequestBody requestBody = new MultipartBody.Builder() //原先打算用MultipartBody方法构造requestBody的,后来发现不需要。
                .setType(MultipartBody.FORM)
                .addFormDataPart("username","victor")
                .addFormDataPart("b64",send)
                .addFormDataPart("filename",filename)
//                .addFormDataPart("file","tets.PNG",
//                        RequestBody.create(send,MEDIA_TYPE_OSTREAM))
                .build();
        Request request = new Request.Builder()
                .url(SERVER_URL)
                .post(requestBody)
                .build();
        try (Response response = client.newCall(request).execute()){
            if (!response.isSuccessful())throw new IOException("Unexpected code " + response);
            System.out.println(Objects.requireNonNull(response.body()).string());
        }

    }

}

base64_test.java

package utils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.util.UUID;
import java.util.Base64;


public class base64_test {
    private String IMAGE_URL;
    static String STORAGE_URL = "C:/编程/java/okhttp-test/src/image/";

    public base64_test() {

    }

    public base64_test(String IMAGE_URL) {
        this.IMAGE_URL = IMAGE_URL;
    }
    /*
        将图片编码成 Base64字符串
     */
    public String Encode_To_Base64() throws Exception {
        File file = new File(IMAGE_URL);
        FileInputStream inputStream = new FileInputStream(IMAGE_URL);
        byte[] buffer =  new byte[(int)file.length()];
        //noinspection ResultOfMethodCallIgnored
        inputStream.read(buffer);
        inputStream.close();
        BASE64Encoder encoder = new BASE64Encoder();

        return encoder.encode(buffer);
    }

    public void  Decode_To_Image(String Base64,String Type){
        BASE64Decoder decoder = new BASE64Decoder();
        String random_file_name = UUID.randomUUID().toString();
        try {
            FileOutputStream outputStream = new FileOutputStream(new File(STORAGE_URL+random_file_name+"."+Type));//随机uuid存储解码后的图片
            byte[] decodeBytes = decoder.decodeBuffer(Base64);
            outputStream.write(decodeBytes);
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String ...args)throws Exception{
        String string =  new base64_test("C:\\编程\\java\\okhttp-test\\src\\source\\test.PNG").Encode_To_Base64();
        new base64_test().Decode_To_Image(string,"PNG");

    }
}

服务端

from flask import Flask,url_for,request,escape,jsonify
from werkzeug.utils import secure_filename
import os
import base64
app = Flask(__name__)

@app.route('/')
def hello_world():
        return 'Hello world'

@app.route('/receive',methods=['POST'])
def receive():
    #测试接受base64编码过的图片
    user_id = request.form['username']
    img_filename = request.form['filename']
    test_image = base64.b64decode(request.form['b64']) #本质就是解码字符串
    upload_image_dir = "user_image"

    if not os.path.isdir(upload_image_dir) :
        os.mkdir(upload_image_dir)
    user_dir = os.path.join(upload_image_dir,user_id)
    if not os.path.isdir(user_dir):
        os.mkdir(user_dir)
    file_path = os.path.join(user_dir,img_filename)

    #写入文件
    try:
        with open(file_path,"wb") as f:
            f.write(test_image)
            return "true"
    except:
        return "error"


if __name__=="__main__":
        app.run(port = 5000,debug = True)

运行反馈

在这里插入图片描述

jar包依赖

下载地址

参考

官方示例

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中使用OkHttp3客户端连接到Flask-SocketIO服务器,您需要遵循以下步骤: 1. 在Java应用程序中,使用Maven或Gradle等构建工具将OkHttp3客户端库添加到您的项目中。例如,可以使用以下Maven依赖项: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency> ``` 2. 在Java应用程序中,使用以下代码创建OkHttp3客户端实例并建立与Flask-SocketIO服务器的连接: ```java import okhttp3.*; import org.jetbrains.annotations.NotNull; import java.io.IOException; public class SocketIOClient { private final OkHttpClient client; private final Request request; public SocketIOClient() { this.client = new OkHttpClient.Builder().build(); this.request = new Request.Builder().url("http://localhost:5000/socket.io/").build(); } public void connect() { WebSocketListener listener = new WebSocketListener() { @Override public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) { System.out.println("Connected to server: " + response.message()); } @Override public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) { System.out.println("Received message: " + text); } @Override public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { System.out.println("Disconnected from server: " + reason); } @Override public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, Response response) { System.err.println("Error: " + t.getMessage()); } }; WebSocket ws = client.newWebSocket(request, listener); } } ``` 在上面的代码中,您需要将“http://localhost:5000”替换为您的Flask-SocketIO服务器的URL和端口。 3. 现在,您可以使用WebSocket实例发送和接收消息。例如,以下代码将向服务器发送“hello”消息并处理服务器发送的回复消息: ```java ws.send("hello"); ws.send("hello", new WebSocketListener() { @Override public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) { System.out.println("Received reply: " + text); } }); ``` 在上面的代码中,服务器将使用“message”事件发送回复消息。您可以使用“onMessage”方法侦听此事件并处理消息。 希望这可以帮助您使用OkHttp3客户端连接到Flask-SocketIO服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值