1.图片还好,转Base64时没有出现啥大的问题.
2.视频转Base64时,打印出来的log日志 Base64码只有前半部分,后面相当一大部分base64码都没有. 一开始以为转码代码问题.
解决方法(很狗血):
在转完Base64码时,将Base64字符串写入到本地,在从本地中读取出来,这时的Base64码是一个完整的码,没有丢失的.
注:为啥丢失没搞懂.
1.图片转Base64.
/**
* bitmap转成base64.
* @param bitmap
* @return
*/
public static String bitmapToBase64(Bitmap bitmap) {
String result = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baos.flush();
baos.close();
byte[] bitmapBytes = baos.toByteArray();
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
2.文件(File)转Base64:
注:这个方法是需要导入一个Jar包的,不然BASE64Encoder()报错. jar包可以私聊我要(那些收费下载的 啥啥啥)。.
* 文件转Base64.
* @param path
* @return
* @throws Exception
public static String fileToBase64(String path) throws Exception {
File file = new File(path);
FileInputStream inputFile = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
return new BASE64Encoder().encode(buffer);
注:这个方法不需要jar包
* 文件转Base64.
* @param filePath
* @return
public static String file2Base64(String filePath) {
FileInputStream objFileIS = null;
try {
objFileIS = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
ByteArrayOutputStream objByteArrayOS = new ByteArrayOutputStream();
byte[] byteBufferString = new byte[1024];
try {
for (int readNum; (readNum = objFileIS.read(byteBufferString)) != -1; ) {
objByteArrayOS.write(byteBufferString, 0, readNum);
} catch (IOException e) {
e.printStackTrace();
String videodata = Base64.encodeToString(objByteArrayOS.toByteArray(), Base64.DEFAULT);
return videodata;
3.将字符串写入本地文件:
* 将字符串写入到指定文件.
* @param content
* @param context
public static void saveToFile(String content, Context context) {
BufferedWriter out = null;
//获取SD卡状态
String state = Environment.getExternalStorageState();
//判断SD卡是否就绪
if (!state.equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(context, "请检查SD卡", Toast.LENGTH_SHORT).show();
return;
//取得SD卡根目录
File file = Environment.getExternalStorageDirectory();
try {
if (file.exists()) {
Log.e("print", "file路径:" + file.getCanonicalPath());
//输出流的构造参数1:可以是File对象 也可以是文件路径
//输出流的构造参数2:默认为False=>覆盖内容; true=>追加内容
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file.getCanonicalPath() + "/VideoBase64.txt",
true)));
out.newLine();
out.write(content);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
4.从本地文件读取内容:
* 从SD卡读取指定文件.
* @param context
* @return
public static String readFromFile(Context context) {
//读的时候要用字符流 万一里面有中文
BufferedReader reader = null;
FileInputStream fis;
StringBuilder sbd = new StringBuilder();
String state = Environment.getExternalStorageState();
if (!state.equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(context, "SD卡未就绪", Toast.LENGTH_SHORT).show();
return "";
File root = Environment.getExternalStorageDirectory();
try {
fis = new FileInputStream(root + "/VideoBase64.txt");
reader = new BufferedReader(new InputStreamReader(fis));
String row;
while ((row = reader.readLine()) != null) {
sbd.append(row);
} catch (FileNotFoundException e) {
Toast.makeText(context, "文件不存在", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
return sbd.toString();
说明:1.图片还好,转Base64时没有出现啥大的问题.2.视频转Base64时,打印出来的log日志 Base64码只有前半部分,后面相当一大部分base64码都没有. 一开始以为转码代码问题. 解决方法(很狗血): 在转完Base64码时,将Base64字符串写入到本地,在从本地中读取出来,这时的Base64码是一个完整的码,没有丢失的. ...
图片
上传时,后台接收的方式有好几种,可以直接接收
File
对象,有时候要求将
图片
转
成
Base64
编码以字符串的形式传给服务器。
这里我们说一下
转
Base64
会遇到的问题。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//将bitmap
转
成字节数组流.
boolean compress = bitmap.compress(Bitma...
public static String
file
To
Base64
(
File
file
) {
String
base64
= null;
InputStream in = null;
try {
in = new
File
InputStream(
file
...
最近遇到需求是前后端传输
图片
使用的是
Base64
,但是前端(
Android
端)
图片
很大(尺寸很大4480 × 2520,质量也很大7-10M),需要压缩到一定尺寸(1280 × 960,当然还可以压得更小),然后传给后端,本来认为是一个简单的压缩,可是在子线程压缩过程中发现很卡,卡的主线程的进度条都走不动了,一开始用的模拟器测试的,以为模拟器性能比较差,可是换成手机测试,还是子线程压缩过程中很卡,卡的主线程的进度条都走不动了。为了解决这个问题,请看以下步骤:
1、先申请读写权限,要允许权限才可以进行之后
public static String imageTo
Base64
(String path){
if(TextUtils.isEmpty(path)){
return null;
InputStream is = nu...
public static String
file
To
Base64
(
File
file
) {
String
base64
= null;
InputStream in = null;
try {
in = new
File
InputStream(fil...
在项目中需要用到
文件
传输入,为了传输方便最好的办法是将
文件
转
成
base64
字串,再将
base64
字串
转
成字节流保存在
文件
了。
不过这种做法的虽然简单,但还是要根据实际需要进行选择;弊端是不能
转
太大的
文件
,
文件
太大会造成效率上的问题。具体多大,笔者没有做深入研究和实际测试。如有兴趣,可以自己深入研究测试。
需要导入 import
android
.util.
Base64
;
{CSDN:C
项目中经常会用到上传
图片
/
视频
的地方,比如上传头像,上传商品
图片
、证件
图片
、小
视频
等等,我们需要将
图片
转
为
base64
后再提交给后台,然后后台再将
base64
转
成
图片
后进行保存,这里是基于vue+vux来写的,H5实现的基本逻辑也是一样的,样式部分省略。
一、
图片
上传
1、html部分
<template>
<div class="index">
<...
在工作中,前端上传
视频
或者大
文件
的时候,由于
文件
过大,上传时间过长,我们需要对
文件
进行一个切片的处理,然后上传片数,最后由后端整合,但是也有一些
视频
类的
文件
会被防火墙拦截,这就需要我们
转
化成
base64
格式上传了,
首先我们要知道,
文件
是以Blob的数据类型存在的,Blob有一个特点,就是支持分割,
关于Blob可以参考Blob - Web API 接口参考 | MDN来理解
先上一段简单的代码
//首先是切割
文件
var blob =
file
; var a...