JAVA上传文件服务器端验证的问题?

问题描述:

[img]/upload/attachment/50203/6e9c13e8-f97f-393d-8654-81bf94e32632.jpg[/img]
怎么在服务器端验证
1.文件大小?
2.文件后缀名?
但如果只有字符串验证后缀名的话,别人把JSP文件改成JPG文件之后上传过来之后,来访问这个JPG文件会不会运行JSP里面的代码呢

如果有人上传带病毒的JPG文件怎么办啊
怎么验证这些东西呢

周未没有人提问啊......

[b]问题补充:[/b]
但是别人上传了一张有病毒的JPG怎么办啊....
[b]问题补充:[/b]

怎么在服务器端验证
1.文件大小?
2.文件后缀名?
但如果只有字符串验证后缀名的话,别人把JSP文件改成JPG文件之后上传过来之后,来访问这个JPG文件会不会运行JSP里面的代码呢

如果有人上传带病毒的JPG文件怎么办啊
怎么验证这些东西呢

周未没有人提问啊......

问题补充:
但是别人上传了一张有病毒的JPG怎么办啊....
[b]问题补充:[/b]
javaeye有上传文件有杀毒模块没有?
[b]问题补充:[/b]
晕死了,服务器上还安杀毒软件的啊......

[quote]1.文件大小?[/quote]
根据http消息头中的Content-length,一般上传类库如apache fileupload中都有相关API的。

[quote]2.文件后缀名? [/quote]
这个也只能这样,现在如果一个文件没有后缀连[color=red]window都无法智能识别[/color]它的内容是啥格式,何况是你的程序了。

[quote]来访问这个JPG文件会不会运行JSP里面的代码呢 [/quote]
这个你试试不就知道了吗,呵呵。

[quote]如果有人上传带病毒的JPG文件怎么办啊 [/quote]
难不成你还想给你的上传程序带一个病毒特征库??嘿嘿。写一个杀软模块儿??

[quote="langhua9528"]别人把JSP文件改成JPG文件之后上传过来之后,来访问这个JPG文件会不会运行JSP里面的代码呢 [/quote]
这个问题一般不用担心。除非你没有约束raw jsp,允许直接访问jsp文件,否则所有*.jsp的请求都无法被接受。类似的,如果你没有配置*.jpg为一个servlet mapping url pattern的话,所有*.jpg的请求都只会被成当一个静态资源来处理。

[quote="langhua9528 "]问题补充:
但是别人上传了一张有病毒的JPG怎么办啊.... [/quote]
这个可以、也应该由服务器的杀毒软件来负责解决。

[quote]但是别人上传了一张有病毒的JPG怎么办啊.... [/quote]
你服务器上的杀软啥干啥的啊,再说,一般服务器都是unix或linux的,怕啥病毒啊!

[quote]javaeye有上传文件有杀毒模块没有? [/quote]
哈哈,哥们儿,我开个玩笑你还当真了啊!这个东西不可能实现的,要是你真能搞出杀毒模块儿,你可以直接搞杀毒软件卖钱了。

[quote]晕死了,服务器上还安杀毒软件的啊...... [/quote]
如果你是linux或unix可以不安装,多数服务器也都是linux或unix的,比如javaeye就是SUSE Linux的。

给你发段服务器处理上传文件的代码:
String fileName = null;
try{
if(ServletFileUpload.isMultipartContent(request)){
File saveDir = new File(getServletConfig().getServletContext().getRealPath("/uploads"));
DiskFileItemFactory dff = new DiskFileItemFactory();
//dff.setRepository(tmpDir);
dff.setSizeThreshold(1024000);
ServletFileUpload sfu = new ServletFileUpload(dff);
sfu.setFileSizeMax(5000000);
sfu.setSizeMax(10000000);
FileItemIterator fii = sfu.getItemIterator(request);
while(fii.hasNext()){
FileItemStream fis = fii.next();
if(!fis.isFormField() && fis.getName().length()>0){
fileName = fis.getName().substring(fis.getName().lastIndexOf("\")+1);
BufferedInputStream in = new BufferedInputStream(fis.openStream());
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(saveDir.getPath()+"\"+fileName)));
Streams.copy(in, out, true);
}
}
PrintWriter out = response.getWriter();
out.println("File upload successfully!!!
");
out.println("Download");

}

}catch(Exception e){
e.printStackTrace();
}

sfu.setFileSizeMax(5000000)限制了上传文件的大小
fis.getName().substring(fis.getName().lastIndexOf(".")+1)返回的是文件后缀,加上这句就可以了。至于判断文件是否带病毒,本人无能为力。

每个文件头,都有文件类型,可以读到文件的具体类型标志,就可以判断用户上传的是不是图片了,不用判断后缀了,你可以文件头这方面的资料