开发中遇到的一个问题,原始需求需要把图片转成base64String上传到接口,接口平台将String写入到sftp,
后续再从sftp下载图片。
问题:上传的图片下载下来打开报错。
可能原因1:图片转成base64String的时候带了前缀
src="https://img-blog.csdnimg.cn/2022010618190097700.jpeg"
如果是这种需要将"data:image/jpeg;base64,"替换成空
后经测试发现,直接用图片转base64String发现未带前缀。。。。。。。。
可能原因2:图片转存时不是通过Base64.Decode(String)得到的byte数组。
最终问题:服务器转存图片到sftp的时候,没有做decode而是直接用String.getByte()得到byte数组。
解决办法:接口接收到上送的String时先用base64进行decode,得到byte数组。此时的数组时可以直接写入到图片的。
test代码:
/**
* 图片转base64字符串
* @param filePath
* @return
*/
public static String getFile(String filePath) {
byte[] data = null;
FileInputStream is = null;
try {
is = new FileInputStream(new File(filePath));
data = new byte[is.available()];
is.read(data);
return new String(Base64.encode(data));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != is) {
try {
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "";
}
//测试方法
public static void main(String[] args) throws IOException {
String fileContent=getFile("c:\\users\\jugg\\desktop\\222.jpg");
System.out.println(fileContent);
File file1=new File("c:\\users\\jugg\\desktop\\tmp123");
File file2=new File("c:\\users\\jugg\\desktop\\tmp456");
byte[] decoByte=Base64.decode(fileContent);
for (int i = 0; i < decoByte.length; ++i) {
if (decoByte[i] < 0) {
decoByte[i] += 256;
}
}
FileUtils.writeByteArrayToFile(file1, decoByte);
InputStream io=new ByteArrayInputStream(fileContent.getBytes());
byte[] data=new byte[io.available()];
io.read(data);
FileUtils.writeByteArrayToFile(file2, data);
}
实验结果:直接在生成的文件后面加jpg后缀发现,前者(tmp123.jpg)能正常打开。后者(tmp456.jpg)图片损坏,无法正常打开。