Android ByteArrayOutputStream Base64.encodeToString 以图像形式保存到服务器,如何?

Android ByteArrayOutputStream Base64.encodeToString save to Server as Image, How?

android studio 我使用这段代码将 image 转换为 byte array 并发送到服务器:

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] byteArrayImage = baos.toByteArray();
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 
ServerService.sendProfileImage(encodedImage);

在 node-js 后端中,我使用此代码将数据写入文件:

let imageBuffer = new Buffer.from(data.info, 'Base64');
fs.writeFile(fd, imageBuffer, (err, written) => {
    if(err) {
        callBack(err);
        return;
    } else{
        fs.close(fd, () => {
            callBack(null);
            return;
        });
    }
})

Note: back-end works perfect with browser and saved images show correctly, > no problem; Android data is saved too, but image is not in correct format.

但是出了点问题,图像不是有效文件。

java 代码生成正确的 Base64 图像字符串。

将此字符串发送到您的服务器时可能出现问题。尝试在服务器端打印您的 base64 字符串,以检查您是否从请求中获取了完整的字符串。如果字符串正确,则尝试使用以下代码保存图像

app.post('/save-image', (req, res) => {
    require("fs").writeFile("out.jpg", req.body.info, 'base64', function(err) {
        console.log(err);
    });
})

以上代码使用 body-parser 包来访问信息字段。

这是我在 Android

中使用的代码
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle

import android.util.Base64
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import okhttp3.*
import java.io.ByteArrayOutputStream
import java.io.IOException

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        submit.setOnClickListener {
            val bitmap = BitmapFactory.decodeResource(resources, R.drawable.out)
            val baos = ByteArrayOutputStream()
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
            val imageBytes: ByteArray = baos.toByteArray()
            val imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT)
            send(imageString)
        }


    }

    private fun send(imageString: String) {
        val body = FormBody.Builder()
        body.add("info",imageString)
        val request = Request.Builder().url("http://192.168.1.4:3000/save-image").post(body.build())
        OkHttpClient.Builder().build().newCall(request.build()).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.e("Failure",Log.getStackTraceString(e))
            }

            override fun onResponse(call: Call, response: Response) {
                Log.e("response",response.body?.string() ?: "failed")
            }

        })
    }
}