日期:2014-05-18  浏览次数:20636 次

servlet文件上传过大提示
当客户端上传一个较大的文件时 在文件还没完全上传到服务器时进入了自己的servlet doPost方法 然后通过request.getContentLength()方法获取上传内容的大小  当上传内容超过指定的大小时 out.write("{'state':'1'}"); 并return  再客户端提示。但我们发现点击上传时能立刻获取上传内容的大小 也就是request.getContentLength()能够立刻取到值,同时我的servlet方法也能立刻return出去  但是客户端仍然在将文件往服务器提交  也就是说 out.write("{'state':'1'}");在等待 request文件上传的结束才能做out.write操作 我试过 通过request.getInputStream().close(); 我甚至试过获取当前线程并stop(),但都仍无效  我也试着抛出异常 结果还是一样 一直要等到文件上传完才做下一步的事情,请求大牛们帮忙分析一下 ,如何获取文件大小后立即输出内容而不是等待文件上传完后再输出
------解决方案--------------------
引用:
回复 8楼 9楼 我大致说明一下文件上传的一个流程(不一定正确 仅供参考) 当我们提交的表单中含有enctype="multipart/form-data" 这个属性时  那么浏览器自动将表单数据和文件转成二进制数据 并提交的服务器 而我们做的仅仅是解析二进制流
这里假设有10M的文件 完全上传到服务需要1分钟
当我们提交时 可能前5秒钟就进入了我们的servlet方法 我们这个时候已经可以取得上传内容的大小(可能是建立连接时一些包头信息),但此时二进制内容仍然还在不断的向服务器传输 甚至知道我们走完所有的自己的方法 这个传输还没结束,而我们的response输出是要等到 传输进来的内容全部结束后才会进行,所以在此期间所有对response的操作都将暂停直到传输结束
而我的问题就在于 如果当我获取到文件大小超过限制时  中断浏览器向服务器提交数据 因为此时我已经不需要这些上传的内容了
明白楼主的意思了,查过相关资料,询问过大牛,都说存在这种情况,但不绝对,可能跟浏览器有关(有些浏览器可能分多线程来执行,所以不会有明显影响)。另外,统一回答都是,这个传送是不可控的,前台JS有可判断大小的函数和方法,楼主百度一下。
------解决方案--------------------
引用:
回复 8楼 9楼 我大致说明一下文件上传的一个流程(不一定正确 仅供参考) 当我们提交的表单中含有enctype="multipart/form-data" 这个属性时  那么浏览器自动将表单数据和文件转成二进制数据 并提交的服务器 而我们做的仅仅是解析二进制流
这里假设有10M的文件 完全上传到服务需要1分钟
当我们提交时 可能前5秒钟就进入了我们的servlet方法 我们这个时候已经可以取得上传内容的大小(可能是建立连接时一些包头信息),但此时二进制内容仍然还在不断的向服务器传输 甚至知道我们走完所有的自己的方法 这个传输还没结束,而我们的response输出是要等到 传输进来的内容全部结束后才会进行,所以在此期间所有对response的操作都将暂停直到传输结束
而我的问题就在于 如果当我获取到文件大小超过限制时  中断浏览器向服务器提交数据 因为此时我已经不需要这些上传的内容了

不好意思我确实理解有问题,整天用框架没关注过这些底层知识,问了一下我们技术总监,浏览器会把整个表单数据转成协议标准数据发送给服务器,所以说这个的确是无法控制的,只有在服务器接受到这个请求中的contentlength以后才能做出控制。不过引入html5之后是可以很方便的控制的!