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")
}
})
}
}
在 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")
}
})
}
}