spring boot结合FastDFSClient做下载文件注意事项

spring boot结合FastDFSClient做下载文件注意事项

1.后台下载方法走完后,前端页面浏览器一直没出现下载框。
2.ie浏览器兼容问题。

下面的FastDFSClient类依赖fdfsclient-jar-with-dependencies.jar包
下面是后台代码。

// An highlighted block
/**
	 * 下载
	 * @return
	 * @throws Exception 
	 */
	@ResponseBody
	@RequestMapping(value="/downloadXmlFileList", method={RequestMethod.GET,RequestMethod.POST},produces="text/html;charset=utf-8")
	@ApiOperation(value="下载", notes="下载",response=Long.class)
	public void downloadXmlFileList(HttpServletResponse response,String ids){
		ResultBean<String> rs = null;
		try {
			List<ImportXmlRecordData> importXmlRecordDataList = importXmlRecordService.getAllFdfsclientfileidByIds(ids);
			if(importXmlRecordDataList != null && !importXmlRecordDataList.isEmpty() && importXmlRecordDataList.size() > 0) {
				ImportXmlRecordData importXmlRecordData = importXmlRecordDataList.get(0);
				byte[] data =  FastDFSClient.downloadFile(importXmlRecordData.getFdfsclientfileid());
		    	FileUtil.downloadFileByEncode_gb2312(response, data, importXmlRecordData.getFilename());
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

下面是上面代码的解释。
在这里插入图片描述
下面是FileUtil.downloadFileByEncode_gb2312方法。

// An highlighted block
/**
	 * 文件下载
	 * @param response
	 * @param downloadFile
	 */
	public static void downloadFileByEncode_gb2312(HttpServletResponse response, byte[] data, String showFileName) {
		
		BufferedInputStream bis = null;
		OutputStream os = null;
		BufferedOutputStream bos = null;
		try {
	    os = response.getOutputStream(); // 重点突出
	    bos = new BufferedOutputStream(os);
	    // 对文件名进行编码处理中文问题
	    String fileName = new String( showFileName.getBytes("gb2312"), "ISO8859-1"); 
	    response.reset(); // 重点突出
	    response.setCharacterEncoding("UTF-8"); // 重点突出
	    response.setContentType("application/x-msdownload");// 不同类型的文件对应不同的MIME类型 // 重点突出
	    // inline在浏览器中直接显示,不提示用户下载
	    // attachment弹出对话框,提示用户进行下载保存本地
	    // 默认为inline方式
	    response.setHeader("Content-Disposition", "attachment; filename="+fileName); // 重点突出
	    bos.write(data, 0, data.length);// 将文件发送到客户端
	    
	} catch (Exception ex) {
		ex.printStackTrace();
		throw new RuntimeException(ex.getMessage());
	} finally {
		// 特别重要
	    // 1. 进行关闭是为了释放资源
	    // 2. 进行关闭会自动执行flush方法清空缓冲区内容
			try {
				if (null != bis) {
					bis.close();
					bis = null;
				}
				if (null != bos) {
					bos.close();
					bos = null;
				}
				if (null != os) {
					os.close();
					os = null;
				}
			} catch (Exception ex) {
				throw new RuntimeException(ex.getMessage());
			}
		}
	}

以上都是后台的代码

下面是前台代码

前台代码出现了两个问题。
1.后台下载方法走完后,前端页面浏览器一直没出现下载框。
这是之前的前端下载代码。

// An highlighted block
$.form({
		type: "GET",
		dataType: 'text',
		async: true,
		url: '<%=basePath%>importXmlRecord/downloadXmlFileList?ids='+checktdArr,
		success:function(respose){
			debugger;
			$.messager.alert('提示',"下载成功!",'success');
		},
		error:function(respose){
			debugger;
			$.messager.alert('提示',respose.msg,'error');
		}
	 })

在网上查了一下,这样提交相当于ajax提交,ajax提交后看不到下载框,要用form提交可以出现下载提示框,于是改成下面的方式,就可以在下载文件后看到下载提示框了。

// An highlighted block
$form = $('<form method="post"></form>').appendTo('body');
	var url = '<%=basePath%>importXmlRecord/downloadXmlFileList';
	$form.form('submit', {    
	    url: url, 
	    dataType: 'text',
	    onSubmit:function(para){
	    	para.ids = checktdArr;
	    },
	    success:function(respose){
	    	$.messager.alert('提示',"下载成功!",'success');
	    },
	    error:function(respose){
			$.messager.alert('提示',"下载失败!",'error');
		}
	});
	$form.remove();

2.谷哥浏览器可以正常下载后,去ie浏览器上试了一下,ie不能正常下载,而且点击下载按钮后总是会出现迅雷下载框提示下载与文件无关的东西,并且后台报ClientAbortException:java.io.IOException错误。去网上查了一下,设置了一下ie浏览器的管理下载项,ie浏览器就可以正常下载了。
(1)Internet选项,打开 ”管理下载项“。
(2)在工具和扩展中找到了,迅雷下载支持,并且是启用的,然后禁用它。
在这里插入图片描述
(3)重启 IE之后:进行下载操作,结果一切正常,问题解决:
在这里插入图片描述
下面是ie浏览器设置的参考网址。
https://www.cnblogs.com/beijixingzhiguang/p/4990984.html

这样可以正常下载了,但没有返回到success和error方法中,这个还有待解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
文本格式不能很好显示,请见谅(附件里有比较齐整的excel表格统计) 大小类型 传输类型 api方法 文件大小 花费时间 速率byte/ms 速率mb/s 缓存数组 次数 备注 大文件 下载 download_file(group_name, remote_filename, localFile) 1073741824(约1G) 28343ms 37883 36.12804413 无 1 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 29195ms 36778 35.07423401 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 24352ms 44092 42.04940796 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 24831ms 43241 41.23783112 2K 1 实现DownloadCallback,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 25922ms 41422 39.50309753 8K 1 实现DownloadCallback,BufferedOutputStream 普通文件 下载 download_file(group_name, remote_filename, localFile) 59113472(约56M) 382ms 154747 147.5782394 无 1 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约57M) 369ms 160199 152.7776718 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约58M) 499ms 118702 113.2030487 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 59113472(约59M) 592ms 99853 95.22724152 2K 1 实现DownloadCallback,BufferedOutputStream 下载建议:100M内数据使用fastDFS提供的DownloadStream;大于1G的数据,使用BufferedOutputStream和DowloadStream

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值