以下为个人想法,仅限参考,如有不对,欢迎留言更正:
在activiti工作流的模型导出时遇到一个问题,平均以10kb大小为界限,10kb以内的能够正常导出,超过10kb的浏览器会直接在页面预览,不能正常导出。
经过各种方式测试与大量对比网上资料,发现文件response存在一个分块输出的原理,一旦文件过大就会将文件分成一块一块的字节流输出,一旦response进行了分块操作,那么设置Header的时候就一定要注意,一定要在输出流执行之前进行初始化(设置response的各种属性)。
个人理解(不懂原理,只能这样了):
文件小,response不需要分块操作,所以你在response执行完毕之前设置属性都可以,因为只有一个输出流进行操作。
但是一旦文件过大,进行分块后有多个输出流执行,这时候设置属性,response就不知道如何进行解析定位(或者是将属性赋予了第一个输出流,后面的使用默认属性)。
由于response使用的是缓存机制,一个输出流响应后匹配属性正常,多个输出流分块后匹配一个属性设置,要么无法匹配,要么匹配其中一个,就导致最终响应头属性设置失败,后果就是下载变成了预览功能。