文件的上传下载
文件上传
在表单中使用表单元素 input type=“file” ,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data。
对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
- 进入这个网址 :http://commons.apache.org/proper/
- 选择 commons-fileupload/和commons-io
- 下载commons FileUpload组件以及commons io组件
- 将上述jar包添加到项目的WebRoott/WEB-INF/lib文件夹中。
文件上传的细节
上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意: 1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。 2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。 3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。 4、要限制上传文件的最大值。 5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。
JavaWeb的上传需要用到FileItem类, FileItem是一个接口,它的实现类是DiskFileItem。
需要注意getName():
用于获得文件上传字段中的文件名。
注意:IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。在IE中想要获取文件名需要进行字符串截取,代码如下:
String fileName = item.getName();
int index=fileName.lastIndexOf("\\");
if(index!=-1) {
fileName=fileName.substring(index+1);
}
。
创建jsp页面
<form action="FileUp" method="post" enctype = "multipart/form-data">
<input type="file" name = "fileUp" >
<input type="submit">
FileUp.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload/");
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp/");
File tmpFile = new File(tempPath);
File saveP = new File(savePath);
if(!saveP.exists()){
saveP.mkdirs();
}
if(!tmpFile.exists()){
tmpFile.mkdirs();
}
String mesage = "";
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*100);
factory.setRepository(tmpFile);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024*1024*10);
try{
List<FileItem> items = upload.parseRequest(request);
for(FileItem list:items){
String contentType = list.getContentType();
long sizeInBytes = list.getSize();
InputStream in = list.getInputStream();
byte[] buffer = new byte[21000];
int len = 0;
String fileName = list.getName();
int index=fileName.lastIndexOf("\\");
if(index!=-1) {
fileName=fileName.substring(index+1);
}
//.getName()注意:IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。在IE中想要获取文件名需要进行字符串截取,代码如下:
OutputStream out = new FileOutputStream(savePath+"/"+fileName);
while((len = in.read(buffer))!=-1){
out.write(buffer,0,len);
}
out.close();
in.close();
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
查找之后打开E:\apache-tomcat-7.0.82\webapps\fileDownloadUp2_5\WEB-INF\upload可以看到上传的文件。
上一篇: 首款天玑9000旗舰!OPPO Find X5代号曝光:全是上古神兽
下一篇: 文件上传下载