import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class FileChangeBase64 {
//这里的filePath和apiUrl组合在一起才是完整的图片url路径,可以直接变为一个参数
public static ArrayList<Map<String,String>> readFileFromUrl(String filePath,String apiUrl) throws IOException {
ArrayList<Map<String,String>> list =new ArrayList();
//由于一些原因path是一个json字符串,所以下面对字符串进行处理,处理完成后是一个数组;
JSONArray jsonArray = JSON.parseArray(filePath);
ArrayList fileList = new ArrayList();
ArrayList nameList = new ArrayList();
for(int i = 0; i < jsonArray.size(); i++){
fileList.add(jsonArray.get(i));
}
for(int j = 0; j < fileList.size(); j++) {
JSONObject obj = new JSONObject();
obj = JSONObject.parseObject(fileList.get(j).toString());
//下面就是进行连接
URL url = new URL(apiUrl + obj.getString("url"));
URLConnection urlConnection = url.openConnection();
//设置连接超时时间和读取超时时间,可以百度,都可以查到
urlConnection.setConnectTimeout(6000);
urlConnection.setReadTimeout(6000);
//获取输入流
InputStream fileInputStream = urlConnection.getInputStream();
//这里在下面会解释一下
byte[] imageBytes = new byte[2048];
int length;
StringBuilder fileString = new StringBuilder();
while ((length = fileInputStream.read(imageBytes)) != -1) {
String data = Base64.getEncoder().encodeToString(imageBytes);
data = data.replaceAll("=", "+");
fileString.append(data);
}
Map<String,String> map = new HashMap<>();
map.put("fileName", obj.getString("fileName"));
map.put("base64",fileString.toString());
list.add(map);
//最后记得一定一定要关闭输入流!!!!!
fileInputStream.close();
}
return list;
}
}
备注:
byte[] imageBytes = new byte[2048];
int length;
StringBuilder fileString = new StringBuilder();
while ((length = fileInputStream.read(imageBytes)) != -1) {
String data = Base64.getEncoder().encodeToString(imageBytes);
data = data.replaceAll("=", "+");
fileString.append(data);
}
对与这段代码对小白进行解释:
1、由于base64太长,所以解析的输入流是一段一段解析的,所以设置了一个byte[]来接收部分编码(如果不了解,可以在while循环中打印第一段,再通过base64解码,深入了解);
2.data = data.replaceAll("=",“+”)这行代码是因为在每一段的base64最后都会有一个'=',需要替换(replaceAll的作用就是将data字符串中所有的'=' 替换为'+')
纯属个人见解,大佬勿喷!!