框架搭建:jsp+springMVC+mybitis。
问题描述:编辑器Ueditor中可以上传附件,内容编辑完以后,阅读内容时,显示附件,但是附件是使用标签a来显示。无法下载。
解决办法:监控内容中所有的a标签,被点击以后,出发点击事件,获取href附件地址,请求下载接口下载附件。
jsp:
<!-- 资源下载隐藏form --> <form action="" id="sourceUploadForm" method="post" style="display: none;"> <input type="hidden" name="sourceUrl" id="sourceUrl"/> </form>
<!-- 内容显示div --><div id="content"> </div>
js:
//监控内容文档中所有a标签的点击事件 $('#content').on('click','a',function(){ var sourceUrl = $(this).attr("href"); //下载资源 $("#sourceUploadForm").attr('action',sourceUploadURL); $("#sourceUrl").val(sourceUrl); $("#sourceUploadForm").submit(); return false; })
监控div id=content下所有a标签的点击。然后以form形式请求下载接口。该click事件必须以返回false,不然a标签执行完click内容以后会执行href连接跳转。返回false以后将不会执行后面的跳转。
java:
/** * ueditor编辑器附件下载 * @param request * @param respnose * @param source * @return */ @RequestMapping("/sourceUpload") @ResponseBody public ResponseEntity<byte[]> sourceUpload(HttpServletRequest request, HttpServletResponse respnose, @ModelAttribute Source source) throws IOException { //获取系统间隔符 String sepStr = System.getProperty("file.separator"); String sourceUrl = source.getSourceUrl(); String sourceUrlUpload = sourceUrl.replace("/",sepStr); String path = request.getSession().getServletContext().getRealPath(sourceUrlUpload); File file = new File(path); InputStream is = new FileInputStream(file); byte[] body = new byte[is.available()]; is.read(body); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attchement;filename=" + file.getName()); HttpStatus statusCode = HttpStatus.OK; ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode); return entity; }
对于下载比较大的附件,该方法可能会出现内存溢出的异常,因为我附件都不大,所以没有做特别处理。
String sourceUrl = source.getSourceUrl();
String sourceUrlUpload = sourceUrl.replace("/",sepStr);
这一块处理是为了适应linux和windows不同环境下路径的问题。