你可以将你上传的文件大小得到 然后和你xml中配置的大小比较一下
解决方案 »
- jsp跳转问题,所有操作都可以进行,跳转时出错,代码和错误都在,帮忙看下
- 自学jsp,遇到问题,请赐教!
- 我想找一个测试的论坛
- 请教一个tomcat配置泛域名的问题~!~!~!
- 关于MYSQL的问题,十分着急啊!!请大家帮忙!
- 如何在jsp实现视频录制功能,给点提示,有简单例子更好,小弟谢谢!!!
- 那个web编辑器能和ie8兼容呢。最近在调试fckedirtor兼容ie8的问题。郁闷!!!
- 请问从表中提取数据怎样实现自动分页???
- 我使用Oracle数据源来连接Oracle数据库,总是失败,请教有经验的朋友。
- jbuilder8 的serial number 和key 是多少?
- jsp分页时,每一页都有单选 复选按钮,在页与页之间转换时,怎么让前一页单选 复选按钮德值保留?
- 救命啊~~jacob如何设置word水印文字~~
,指定到你想要给出提示的页面
2.如何解决数据丢失问题?这种问题只能给个思路吧,做起来问题就多啦,我是这样想的
1.你可以用一个filter,在这个filter里就提前读到这个要上传的文件的大小,如果>所定值,提示!
2.数据丢失问题,如果非要用struts里的上传的话,你可以把这个文件在读入时分割成最大值,也就是我每次实体化的时候的单位就是我所认定的最大值
最好能符合struts2风格。
我已经说了前提了,struts2里面设置了拦截器,我引用了paramsPrepareParamsStack,里面的upload拦截器默认2M。
大于2M,后台比较有什么用啊,根本不进入后台?
哎,给个正解吧,不要浪费我的感情,欺骗我的表情了。
17楼的,我知道如何配最大文件超过2M的CASE,但是问题是 超过10M的时候,我如何显示出错信息,如何保持画面上的数据。
这里是因为Struts2.0默认的上传文件的大小是2M.如果上传超过这个大小的就会报错.可以通过在struts.xml中修改默认的上传文件大小:<constant name="struts.multipart.maxSize" value="5242880" />,我在这里设置成了5M,允许上传5M的文件.如果用户上传的文件,超过了在Action中Iterceptor中的大小,而小于Struts.xml文件中设置的大小,一切正常;一旦上传的文件超过了Struts.xml文件中设置的大小,问题就出现了,虽然也能正常的返回上传页,但数据丢失......这个受不了啊哪位高人也遇到过这种问题,并且解决了,不妨告诉小弟一下,^_^,小弟这里先谢谢了....PS:暂时将Struts.xml中设置了1G,如果用户要上传再大的文件,那也没办法了,抓紧时间搞定它....唉.
<interceptor-ref name ="fileUpload" >
<!-- 配置允许上传的文件类型,多个用","分隔 -->
<param name ="allowedTypes" >
application/zip,application/rar,application/octet-stream,image/bmp,
image/png,image/gif,image/jpeg,image/GPG,image/x-png,image/pjpeg
</param>
<!-- 配置允许上传的文件大小,单位字节 -->
<param name="maximumSize">500000</param>
</interceptor-ref >
<interceptor-ref name ="defaultStack" /> <result name="input">uiviews/compInfoUp.jsp</result>
配置了以上拦截器之后,如果上传得图片和文件大小都通过,上传就没有问题,也能成功.
如果第一次上传得类型和大小超出限制了,就会被拦截,上传失败
struts.messages.error.file.too.large……文件大小超限时的错误信息。
struts.messages.error.content.type.not.allowed……文件类型不允许时的错误信息。
定义一个拦截器是最好的办法了吧,在拦截器中查询文件的大小,超过了自定义大小的话跳转回去,把信息set进
request中返回页面提示还有个思路就是用js检查,对js我不是很熟悉,想想表单验证的话js应该还是有这个功能的,但是此方法有个
缺陷,若将xml中文件大小改变的话js无法获取大小,修改的话比较麻烦
如果上传文件的大小超过了<constant name= "struts.multipart.maxSize" value="5242880" />的值,
那么将抛出action级别的错误,要捕获消息请使用<s:actionerror />还有,你上传文件的大小都超过了<constant name= "struts.multipart.maxSize" value="5242880" />的值了,
文件都没有上传到temp文件里,哪有什么数据丢失?(这点和拦截器里设置不同,仅拦截器设置的话,
文件已经上传到服务器上了)不知道是不是我理解错了
而:interceptor是设定action能接受文件的最大长度(action处理前,文件已经上传到服务器上了)
struts.multipart.maxSize = 9999999999
设置成一个比较大的值,也是就说maxSize远远要大于可能上传文件的大小和fileUpload拦截器中maxinumSize的值我的 struts.properties 设置如下:struts.multipart.maxSize = 9999999999struts.multipart.saveDir = /temp要是还不对的话,找我!!!
struts.messages.error.uploading 用于提示一般的上传出错信息
struts.messages.error.file.too.large 上传文件的大小
struts.messages.error.content.type.not.allowed 上传文件的类型
针对问题2:
你可以把上传大小设置成一个比较大的值。(同上)
1.如何在上传文件超过设定大小时,在页面上显示错误信息(上传文件太大),struts.messages.error.file.too.large尝试了一下,发觉没有效果?
2.如何解决数据丢失问题? 这种问题只能给个思路吧,做起来问题就多啦,我是这样想的
1.你可以用一个filter,在这个filter里就提前读到这个要上传的文件的大小,如果>所定值,提示!
2.数据丢失问题,如果非要用struts里的上传的话,你可以把这个文件在读入时分割成最大值,也就是我每次实体化的时候的单位就是我所认定的最大值.
或者:
org.strsuts.upfile 啥来。有代码提示的 用Formfile类来接受封装。好像大小不受限制的。
很简单的。
看精通struts这本书。那个电子出版社。出版的俄。里面讲的很详细的。
大小时你久返回倒提示页面
至于你说的数据丢失那当然了,因为你读取时如果超过你限定的大小拦截器就会拦截然后抛出异常那你说它能继续读取下去吗
你可以在action中写验证方法来判断
public void validateXXXX(){
if (!getActionErrors().isEmpty()) {
return;
}
}
然后在页面上通过<s:actionerror /> 取得错误信息。
<param name="allowedTypes">
image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png,image/pjpeg
</param>
<!-- 配置允许上传的文件大小 -->
<!-- 500K=0.5*1024*1024 byte-->
<param name="maximumSize">5242880</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
把你配置法来看看
<constant name= "struts.multipart.maxSize" value="最大的数据" />
除此别无它法.COMMON-UPLOAD上2M.如果这里不设置,那就是2M了.但你超过2M,就会出现你所说的结果.在配置文件里的2M要在这个参数内才有效.
这其中当然就包括 文件上传的格式和大小,要不然用户什么格式都给上传
而且吧,你想想.项目做完了,发布到互联网,公司会因为之前的配置有错而停止服务器修改完再启动吗 ???
规范很重要...一些东西在最初就做好约定俗成,这很重要
回到 LZ 现在的这个问题,不瞒你说,这个问题还非得用代码来处理
如果非要使用配置,文件过大导致出错会耗费服务器的大量响应时间
如此这般还不如直接到后台去处理,再说了,难道 使用配置 就不是后台处理了吗 ?这个问题我之前在公司做文件上传的时候就仔细想过,配置并不好
// 上传的文件本身(页面中这样用 <input type="file" name="upload" />)
private File upload; // 上传的文件名
private String uploadFileName; // 上传文件类型
private String uploadContentType;public String load(){
// do something... 重命名上传文件名,上传文件等等...
}// struts.xml 配置 method="load"
public void validateLoad() {
// 如果上传 的文件为空,则直接返回
if ("".equals(uploadFileName) || null == uploadFileName)
addFieldError("message", "<font color='red'>请上传文件</font>");
else {
if (!testpostfix(uploadFileName))
addFieldError("message", "<font color='red'>文件类型错误</font>");
else {
// 文件大小,返回的是 byte
long filesize = upload.length();
if ((filesize / 1024 / 1024.000000000) > 10.000000000)
addFieldError("message", "<font color='red'>文件大小不能超 10 M!</font>");
}
}
}
/**
* 验证后缀名
*/
public boolean testpostfix(String filename) { // 定义可上传文件的 类型
List<String> fileTypes = new ArrayList<String>(); // 图片
fileTypes.add("jpg");
fileTypes.add("jpeg");
fileTypes.add("bmp");
fileTypes.add("gif");
fileTypes.add("png"); // 附件
fileTypes.add("rar");
fileTypes.add("zip"); // 得到文件尾数 并 进行小写转换
String postfix = filename.substring(filename.lastIndexOf(".") + 1)
.toLowerCase();
return fileTypes.contains(postfix) ? true : false;
}
// setter./getter...
这样,如果文件过大,并不会出现服务器假死. LZ 可以自己试试有时候我倒觉得,如果不是强制性的必要,可以不用配置的我都尽量不会用,所以现在 spring hibernate 我都用注解了
这种情况下, extends="struts-default" ,不要使用 文件上传的拦截器文件格式,大小,都到后台去获取,错误信息也在后台加,前台取.有什么不好的你有没有想过.你对 struts 2 这个配置真的有这么依赖吗?看了下,都过去一年了. LZ 怎么就没自己想想 ?也许 struts 2 的有一些东西并不能全部解决我们的需求 ?自己动动脑,想想办法嘛. 就只会 google . baidu解决不了的,我们也可以自主一点啊...
long fileSize = uploadFile.length();
if (fileSize >= 2048000) {
....
}
<constant name= "struts.multipart.maxSize" value="1073741824" />在struts.xml文件的<action></action>中,以参数的形式你想控制的大小,以及类型<param name="allowedSize">2048000</param>
<param name="allowedTypes">
image/png,image/gif,image/jpeg,text/plain,application/msword,application/excel,application/x-rar-compressed,application/x-zip-compressed,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
</param>
这么配置后,只要用户上传的文件不超过1G,就可以跳进action里面,然后通过后台的java代码来限制上传文件大小以及类型,并且可以定一个String变量存反馈信息,例如if (this.rewardfile.length() > this.allowedSize) {
this.setUploadFailedInfo("上传文件失败,上传文件大小超过2M");
return "uploadSizeFailed";
}
if (!this.allowedTypes.contains(this.rewardfileContentType)) {
this.setUploadFailedInfo("上传文件失败,上传文件类型不符合要求");
return "uploadTypeFailed";
}
摘要:【
当上传失败时,能够将其他输入内容显示出来,但是这样做的结果是全部的文件肯定会上传到服务器上,也就是说,虽然是页面上报了文件因为太大,请求被拒绝的错,但是文件依然会被上传到服务器上,commons-fileupload组件根本没会去拦文件的上传。如果出现了这个异常,我们根本无法让原来输入的内容还显示出来的,因为commons-fileupload组件并没有解析全部的输入内容,直接给出异常了,到了params拦截器中,request里就是空的,根本取不到parameter,所以也就无法注入到Action中了。这种情况下,只能显示一个告知用户由于提交数据量过大,服务器拒绝了请求的错误信息,比较好的方法是,直接跳到一个专门的页面,提示用户,然后让用户点返回来再次输入,否则用户会感觉上传文件大就大吧,怎么连我输入的其他一些内容也没给保存住。当然,如果能用Ajax来上传文件,对客户的操作体验可能是最好的,但是,这样可能会导致服务器上有些挂空的文件(上传后从来没被用过),需要想法清除的。】