Java Springboot如何基于图片生成下载链接
现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式。
现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载。由于前端存在跨域问题,所以图片下载由后台接口完成。
首先编写文件下载工具类:
importjava.net.URL;
importjava.net.MalformedURLException;
importorg.apache.commons.io.FileUtils;
publicclassFileDownloadUtil{
/**
*下载文件---返回下载后的文件存储路径
*
*@paramurl文件路径
*@paramdir目标存储目录
*@paramfileName存储文件名
*@return
*/
publicstaticvoiddownloadHttpUrl(Stringurl,Stringdir,StringfileName)throwsBusinessException{
try{
URLhttpurl=newURL(url);
Filedirfile=newFile(dir);
if(!dirfile.exists()){
dirfile.mkdirs();
}
FileUtils.copyURLToFile(httpurl,newFile(dir+fileName));
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();26}
}
publicstaticbooleandeleteFile(Filefile){
if(file.exists()){
returnfile.delete();
}
returnfalse;
}
}
单张图片下载
Controller层接口:
importorg.apache.commons.lang.StringUtils;
importjava.io.*;
protectedHttpServletResponseresponse;
/**
*单张图片下载
*
*@paramurl要下载的图片url
*@author:nemowang
*/
@ApiImplicitParams({
@ApiImplicitParam(name="url",value="图片url",required=true,dataType="String",paramType="query"),
})
@ApiOperation(value="单张图片下载",notes="单张图片下载")
@RequestMapping(value="/downloadPicture",method=RequestMethod.GET)
publicvoiddownloadPicture(Stringurl){
//拼接完整图片路径。这里填写图片链接
StringurlPath="";
//获取图片文件后缀名
Stringpostfix="."+StringUtils.substringAfterLast(url,".");
//获取当前类的所在项目路径
Filedirectory=newFile("");
StringcourseFile;
StringsrcPath;
FilesrcFile=null;
FileInputStreamfileInputStream=null;
InputStreamfis=null;
OutputStreamout=null;
try{
courseFile=directory.getCanonicalPath();
StringfileName="\\"+StringUtil.getUUID()+postfix;
//下载文件
FileDownloadUtil.downloadHttpUrl(urlPath,courseFile,fileName);
srcPath=courseFile+fileName;
srcFile=newFile(srcPath);
fileInputStream=newFileInputStream(srcPath);
fis=newBufferedInputStream(fileInputStream);
byte[]buffer=newbyte[fis.available()];
fis.read(buffer);
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition","attachment;filename="+fileName);
out=response.getOutputStream();
out.write(buffer);
out.flush();
out.close();
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(fileInputStream!=null){
fileInputStream.close();
}
if(fis!=null){
fis.close();
}
if(out!=null){
out.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
//删除中间文件
if(srcFile!=null){
System.out.println(FileDownloadUtil.deleteFile(srcFile));
}
}
因为是GET请求,所以直接拼接接口路由+参数,用浏览器打开就能弹出下载。
至此单张图片下载接口结束。
多张图片打包下载
Controller层接口:
/**
*图片打包下载
*/
@ApiImplicitParams({
@ApiImplicitParam(name="urls",value="图片url列表",required=true,dataType="List",paramType="query"),
})
@ApiOperation(value="图片打包下载",notes="图片打包下载")
@RequestMapping(value="/downloadPictureList",method=RequestMethod.GET)
publicvoiddownloadPictureList(Listurls){
ListfileNameList=newArrayList<>();
for(inti=0;ifileList=newArrayList<>();
ZipOutputStreamzos=null;
OutputStreamout=null;
try{
courseFile=directory.getCanonicalPath();
//下载文件
for(inti=0;i
同样是GET请求,所以也是拼接接口路由+参数,用浏览器打开就能弹出下载。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。