项目中需要对一个点击事件进行下载操作,同时通过点击事件,已经可以从jsp页面获取到需要访问的URL和下载的文件名(数据库获取,jsp页面显示)。点击事件JS如下:
function downloadFile(filePath,fileName){ fileName = fileName.substr(0,fileName.lastIndexOf(".")); $.ajax({ async : false, cache:false, type: 'get', dataType : "json", url: RootPath() + "/checkDownload",//请求的action路径 data:{url:filePath}, error: function () {//请求失败处理函数 alert("下载失败"); }, success:function(json) { //请求成功后处理函数。 var code = json.code; if(code) { window.location.href = RootPath()+"/todownload?url="+filePath+"&name="+fileName; }else { layer.alert(fileName+' 文件不存在'); } } }); }
该ajax调用后台(checkDownload)方法,首先判断从该url能否获得指定下载的文件,如果获取不到,方法返回参数code=0,页面弹出“...文件不存在”。
@RequestMapping("/checkDownload") @ResponseBody public Result checkDownload(String url,HttpServletResponse response) { Result result = Result.createSuccessResult(); HttpURLConnection conn = null; try { URL path = new URL(url); conn = (HttpURLConnection) path.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); conn.getInputStream();// 通过输入流获取数据 } catch (IOException ex) { result.setCode(0); ex.printStackTrace(); }finally { if(conn != null) { conn.disconnect(); } } return result; }
如果checkDownload方法中能够正确获得资源,方法返回参数code=1,ajax成功执行:window.location.href = RootPath()+"/todownload?url="+filePath+"&name="+fileName; 调用(todownload)方法,传入url和name,执行文件下载。
@RequestMapping("/todownload") @ResponseBody public void download(String url, String name, HttpServletResponse response) { HttpURLConnection conn = null; try { File file = new File(url); // 取得文件的后缀名。 String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase(); StringBuffer buffername = new StringBuffer(name); String filename = buffername.append(".").append(ext).toString(); URL path = new URL(url); conn = (HttpURLConnection) path.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); InputStream fis = conn.getInputStream();// 通过输入流获取数据 byte[] buffer = readInputStream(fis); if (null != buffer && buffer.length > 0) { // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition","attachment;filename="+ new String((filename).getBytes("GBK"),"ISO8859_1")); response.addHeader("Content-Length", "" + buffer.length); OutputStream toClient = response.getOutputStream(); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); } } catch (IOException ex) { ex.printStackTrace(); }finally { if(conn != null) { conn.disconnect(); } } } /** * 从输入流中获取数据 * @param inStream 输入流 * @return * @throws Exception */ private byte[] readInputStream(InputStream fis) throws IOException { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while( (len=fis.read(buffer)) != -1 ){ outStream.write(buffer, 0, len); } fis.close(); return outStream.toByteArray(); }
PS:Spring MVC 文件流形式下载(返回)视频文件
import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; /** * 文件流形式下载视频 * @author Front Ng * @date 2019-05-23 09:25 **/ @Controller @RequestMapping(value = "/download") @Api(value = "下载", tags = "下载") public class DownloadController { @ApiOperation(value = "下载视频") @RequestMapping(method = RequestMethod.GET) public void download(HttpServletResponse response) throws IOException { File file = new File("/Users/front/Downloads/123.mp4"); FileInputStream inputStream = new FileInputStream(file); byte[] data = new byte[(int) file.length()]; int length = inputStream.read(data); inputStream.close(); String fileName = URLEncoder.encode("文件流形式视频.mp4", "UTF-8"); response.setContentType("application/octet-stream;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); response.addHeader("Content-Length", "" + data.length); OutputStream stream = response.getOutputStream(); stream.write(data); stream.flush(); stream.close(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍SpringMVC实现文件下载功能,包括了SpringMVC实现文件下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了SpringMVC文件下载的具体代码,供大家参考,具体内容如下 两个案例 1.为登录用户提供下载服务。 2.阻止仅通过输入网址即可获取下载。 文件下载概览 为了将文件发送给浏览器,我们需要在控制器中完成以下操作: 对请求处理方法使用vo
本文向大家介绍jsp实现Servlet文件下载的方法,包括了jsp实现Servlet文件下载的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jsp实现Servlet文件下载的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的JSP程序设计有所帮助。
本文向大家介绍C#实现HTTP下载文件的方法,包括了C#实现HTTP下载文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现HTTP下载文件的方法。分享给大家供大家参考。 主要实现代码如下: 希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍php实现简单文件下载的方法,包括了php实现简单文件下载的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现简单文件下载的方法。分享给大家供大家参考。具体如下: 这里介绍的php文件下载代码,只是简单实现了一张图片的下载功能,还不完善,最好是封装到一个类里,或是采用函数调用。感兴趣的朋友可以在此基础上加以完善! php文件下载代码如下: 希望本文所述对大家的ph
本文向大家介绍Android实现下载文件功能的方法,包括了Android实现下载文件功能的方法的使用技巧和注意事项,需要的朋友参考一下 本文所述为Android实现下载文件功能的完整示例代码,对于学习和研究android编程相信会有一定的帮助,尤其是对Android初学者有一定的借鉴价值。 完整功能代码如下: 读者可以在该实例的基础上进行修改与完善,使之更符合自身项目需求。
本文向大家介绍Silverlight文件上传下载实现方法(下载保存),包括了Silverlight文件上传下载实现方法(下载保存)的使用技巧和注意事项,需要的朋友参考一下 search了非常多的文章,总算勉强实现了。有许多不完善的地方。 在HCLoad.Web项目下新建目录Pics复制一张图片到根目录下。 图片名:Bubble.jpg 右击->属性->生成操作:Resource UC_UpDown