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;i fileList=newArrayList<>(); ZipOutputStreamzos=null; OutputStreamout=null; try{ courseFile=directory.getCanonicalPath(); //下载文件 for(inti=0;i 同样是GET请求,所以也是拼接接口路由+参数,用浏览器打开就能弹出下载。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。