2019-10-31 09:43

@杜福忠 嗯,其实就是click和window.location.href这一行代码的差异,定时器还得要。for+定时器个人感觉没有现在的代码看起来简洁。

2019-10-30 17:33

@JFinal @杜福忠 @happyboy
我又来啦,同样在开发中遇到这类问题,总结了大家的思路,得出自己的解决方式,分享给大家:
问题场景:
1,需要从服务端下载文件,但不支持ajax请求下载的方式,只支持(a href)的方式(与交互需求不符)
2,不支持批量下载,但又不想在服务端压缩后再下载(与需求不符)
解决思路:
1,还是写个(a href),但设为隐藏
2,js中对(a href)进行参数拼接。拼接的内容为服务端的下载接口+文件路径参数
3,js中对(a href)发起模拟点击。点击的次数=批量下载的文件个数
示例如下:
1,(div style="display:none")(a id="download-xx" href="")(/a)(/div)
2,

a,因HTTP只支持a标签为文件下载方式,且不支持批量下载。因此此处是发了个a标签模拟点击事件(页面a标签设为不可见)
b,因点击事件必须有间隔,否则浏览器不处理,因此此处加了定时器。即1s点击一次。点击的次数等于下载的文件个数
c,每点击一次,对url进行参数拼接

var i=0;
var href = "../api/xxxxx/downloadAction?paths=";
var timer = setInterval(function(){
$("#download-xx").attr('href',href + filePaths[i]);//filePaths为需要批量下载的url数组
$("#download-xx")[0].click();
i += 1;
if(i == filePaths.length){
clearInterval(timer);
}
}, 1000);
至此,服务端downloadAction接口,根据接收到的path,renderFile即可.
注:因上面的内容中含html标签,回复后排版有影响。html标签的尖括号用小括号替换了。

2019-10-23 21:08

出现问题的时候搜到楼主的问题,发现楼主并没有详细告知解决方式。刚刚问题解决了,特意又搜了一遍楼主的帖子,回复一下供大家参考:
问题发生的场景:客户端是Android,采用的okHttp进行文件上传;服务端使用的是JFinal提供上传接口,逻辑是用的UploadFile。上传文件时服务端报:Separation boundary was not specified错误。
问题的原因:okHttp文件上传有两种方式,要采用表单提交的那种方式才可以。即,builder.addFormDataPart()是关键。
客户端代码示例如下:
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
builder.addFormDataPart("file",files[0].getName(), RequestBody.create(MediaType.parse("multipart/form-data"),files[0]));
MultipartBody multipartBody = builder.build();
Request request = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody,listener)).build();
okHttpClient.newCall(request).enqueue(callback);