业务场景:
业务后台编辑资讯时候,从其他网页直接复制内容的时候,复制图片,部分图片由于前端跨域问题,无法展示,而且没法上传到本公司的资源文件服务;故需要后台下载图片资源文件,然后再进行上传本公司资源文件服务,再返回前端
问题:
由于网络上的图片路径各式各样,不能单纯通过外链接的后缀来判断图片的类型,如:https://hbimg.huabanimg.com/ff4aceaad9a05333b3e46579d991eecdcffb45f612951-T6WWCx_fw658/format/webp 、https://res.cloudinary.com/dfb5w2ccj/image/upload/v1585064831/blog/4_dcftnc.webp 、http://tnaot-test.oss-cn-hongkong.aliyuncs.com/image/2021/02/24/9a2bab3ff43d4e13a62c7f8335645564.jpg等,可以看出图片文件链接的各式各样,根本没有办法判断是什么图片类型
解决方案:
- 把图片文件下载,如有明显的图片后缀则下载为该类型文件,若没有明显图片后缀则统一下载为jpg
- 进行媒体文件类型进行判断是什么图片文件
- 修改图片文件的名字为正确的文件类型
代码:
1.下载文件
public static File exLinkToFile(String exLink) throws IOException {
URL uri = new URL(exLink);
URLConnection connection = uri.openConnection();
//统一格式处理:除gif、png、jpeg、bmp外,均处理成jpg
String suffix = "jpg";
if (exLink.contains(".gif")) {
suffix = "gif";
}
if (exLink.contains(".png")) {
suffix = "png";
}
if (exLink.contains(".jpeg")) {
suffix = "jpeg";
}
if (exLink.contains(".bmp")) {
suffix = "bmp";
}
File origFile = FileUtils.createTempFile(suffix);
try (InputStream inputStream = connection.getInputStream()) {
Files.copy(inputStream, origFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
UploadExUtil.uploadFail();
}
if (!origFile.exists() || !origFile.isFile()) {
throw new IOException("origFile文件创建失败:" + exLink);
}
return origFile;
}
2.媒体文件类型判断
public class MimeTypeUtils {
private static boolean isBMP(byte[] buf){
byte[] markBuf = "BM".getBytes(); //BMP图片文件的前两个字节
return compare(buf, markBuf);
}
private static boolean isICON(byte[] buf) {
byte[] markBuf = {0, 0, 1, 0, 1, 0, 32, 32};
return compare(buf, markBuf);
}
private static boolean isWEBP(byte[] buf) {
byte[] markBuf = "RIFF".getBytes(); //WebP图片识别符
return compare(buf, markBuf);
}
private static boolean isGIF(byte[] buf) {
byte[] markBuf = &