常见的url包含网络上一些图片的链接,静态服务器上边的图片地址等等,有时候一些链接内嵌到自己项目中时,由于图片大小或者网站的一些防盗处理,往往无法正确加载图片,因此需要单独做处理;
1.pom文件添加
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
2.详细代码
public MultipartFile createFileItem(String url) throws Exception{
FileItem item = null;
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setReadTimeout(30000);
conn.setConnectTimeout(30000);
// 设置应用程序要从网络连接读取数据
conn.setDoInput(true);
conn.setRequestMethod("GET");
String fileName = "";
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream();
//获取文件名称
String newUrl = conn.getURL().getFile();
if (newUrl != null || newUrl.length() <= 0) {
newUrl = java.net.URLDecoder.decode(newUrl, "UTF-8");
int pos = newUrl.indexOf('?');
if (pos > 0) {
newUrl = newUrl.substring(0, pos);
}
pos = newUrl.lastIndexOf('/');
fileName = newUrl.substring(pos + 1);
}
//此处获取两次,是因为如果只获取一次的话,获取type类型时,文件大小会损坏变小,所以重新获取一次
BufferedInputStream bis = null;
HttpURLConnection conn1 = (HttpURLConnection) new URL(url).openConnection();
bis = new BufferedInputStream(conn1.getInputStream());
String type = HttpURLConnection.guessContentTypeFromStream(bis);
FileItemFactory factory = new DiskFileItemFactory(16, null);
String textFieldName = "downloadFile"; //此处任务取值
if(!fileName.contains(".") && type != null){
fileName = fileName + "." + FileUtils.getFileType(type);
}
logger.info("文件名为:" + fileName + " 大小" + (conn.getContentLength()/1024)+"KB" + " contentType=" + type);
item = factory.createItem(textFieldName, type, false, fileName);
OutputStream os = item.getOutputStream();
int bytesRead;
byte[] buffer = new byte[1024 * conn.getContentLength()];
while ((bytesRead = is.read(buffer, 0, buffer.length)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
is.close();
}
if (item != null) {
return new CommonsMultipartFile(item);
}
return null;
}
3.工具类
/**
* 根据content-type获取文件后缀
* @param fileContentType
* @return
*/
public static String getFileType(String fileContentType){
switch (fileContentType) {
case "image/tiff": return "tif";
case "image/fax": return "fax";
case "image/gif": return "gif";
case "image/jpeg": return "jpg";
case "image/png": return "png";
case "image/vnd.wap.wbmp": return "wbmp";
case "audio/x-wav": return "webp";
default: return "jpg";
}
}
在网上查了一些资料,都不是很详细,因此整理一下方便以后使用,可以根据上述代码获取url文件名,文件后缀,文件大小等。
注:如果url中文件自带后缀名,如4.png之类的,是不需要使用上述工具类的,可以直接获取到。