文件上传的实现
a、上传时对表单的要求:
- 文件上传要求客户端表单提交特殊的请求–multipart请求,即包含多部分数据的请求。所以文件上传表单对于表单数据的编码类型要求,必须为multipart/form-data。即要为标签指定enctype属性值为“multipart/form-data”。(enctype,即encodingtype,编码类型。)
- 由于客户端上传文件的大小是不确定的,所以HTTP协议规定,文件上传的数据要存放于请求正文中,而不能够出现在url的地址栏中,因为地址栏中可以存放的数据量太小。也就是说,文件上传的表单,必须提交POST请求,而不能够提交GET请求。
这里介绍的是用jsp+servlet实现的;
jsp表单代码就不贴了,注意2点就行:
1、表单提交必须用post方式 (method=“post”)
2、设置表单enctype属性为”multipart/form-data”
上传
//指定文件存放位置
String filePath = "/images";//这里的斜杠表示项目根目录
//创建文件夹对象(未真正创建文件夹)
File file = new File(filePath);
//如果指定路径文件夹不存在就创建一个文件夹
if(!file.exists()) {
file.mkdirs();
/*file.createNewFile();//这里的文件对象创建时参数要加上file名*/
}
//创建SmartUpload对象
SmartUpload su = new SmartUpload();
//初始化SmartUpload对象
su.initialize(getServletConfig(),request,response);
//设置上传文件的最大值
su.setMaxFileSize(1024*1024*10);
//设置上传文件的总最大值
su.setTotalMaxFileSize(1024*1024*100);
//设置允许上传文件类型
su.setAllowedFilesList("jpg,gif,jpeg,png");
try {
//设置不允许上传的文件类型
//su.setDeniedFilesList("rar,txt,mp4,mp3,zip");
//上传
su.upload();
Files files = su.getFiles();
com.jspsmart.upload.File file1;
for(int i=0;i<files.getCount();i++ ) {
file1 = files.getFile(i);
//遍历上传的所有文件,设置文件名,这里用了自己写的一个工具类UniqueId生成唯一id作为图片的id文件名
file1.saveAs(filePath+"/"+UniqueId.getId()+Math.random()+"."+file1.getFileExt());
//保存文件到指定路径,返回上传了多少个文件
//int n = su.save(filePath);
//System.out.println("上传了"+n+"个文件");
System.out.println(file1.getFieldName());//表单的name值
System.out.println(file1.getFileName());//文件名
System.out.println(file1.getSize());//文件大小
System.out.println(file1.getFilePathName());//文件原始路径加文件名
System.out.println(file1.getFileExt());//文件类型
System.out.println("___________________________________");
System.out.println("___________________________________");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传失败!");
System.out.println(e.getMessage());
}
(在Eclipse中,默认会把Web项目放到Eclipse的工作空间下的.metadata.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下)
在这里可以找到你上传成功的文件。
下载
//超级简单
String fileName = request.getParameter("fileName");
SmartUpload su = new SmartUpload();//创建对象
su.initialize(getServletConfig(), request, response);//初始化
try {
su.downloadFile("/images/"+fileName);//路径加文件名
//su.setContentDisposition();
} catch (SmartUploadException e) {
e.printStackTrace();
}
删除
String filePath = "/images/115049-106.jpg" ;//所在的项目路径
filePath = getServletContext().getRealPath(filePath);//获取真正路径
System.out.println(filePath);
// 在指定路径下创建指定名称的文件
File file = new File(filePath);//获取文件
file.delete();//删除
注意
1,在上传的时候提交表单的时候如果input项有非file类型的,在servlet使用request的时候不能直接使用,而是要用su.getRequest()代替,su是SmartUpload对象,而且要在su初始化和调用upload()方法之后再使用。
2,在输入路径的时候,应用SmartUpload上传保存文件的时候可以用相对于项目的路径,如“/”+上传文件夹,而在创建文件夹要用硬盘真实路径,可以用getServletContext().getRealPath(filePath)获得,filePath指上面的相对于项目的路径。
————————————————