文件的上传与下载
2016/4/21 8:12:12 SeventeenWen
使用*cos*JAR包,支持多文件上传,但不支持文件改名。
POST上传功能代码的实现:
/获取配置文件中的文件夹路径 String str = this.getServletConfig().getServletComtext().getRealPath ("/"+folder) /控制文件上传的大小 int max =2*5*1024*1024; MultipartRequest mr = new MultipartRequest(request,str,max,"GBK");
遇到的问题
表单没有提交到指定的Servlet,解决的方案:
-web.xml文件的配置不对。/Servlet
-注意JSP文件的大小写和默认生成的web.xml中的对应。
文件上传的位置问题
-文件上传位置是.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
Servlet的限制
- request。getParmatere(“xxx”);这个方法在表单属性为enctype=“multipart、form-data”时,不好使。
- ServletInputStream request.getInputStream();获取的整个表单的数据。
通过ServletFileUpload实现文件的上传
使用的JAR包:commons-fileupload.jar和commons-io.jar
- 创建工厂:DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
- 创建解析器:ServletFileUpload
ServletFileUpload sfu = new ServletFileUpload(factory);
- 使用解析器来解析request,得到FileItem(表单项)集合:
List<FileItem> fileItemList = sfu.parseRequest(request);
FileItem的方法
- boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
- String getFieldName():返回当前表单项的名称;
- String getString(String charset):返回表单项的值;
- String getName():返回上传的文件名称
- long getSize():返回上传文件的字节数
- InputStream getInputStream():返回上传文件对应的输入流
- void write(File destFile):把上传的文件内容保存到指定的文件中。
- String getContentType();
简单的实例
// 得到文件上传保存文件目录,将上传的文件保存在这个目录下
String savePath = this.getServletContext.getRealPath("/WEB-INF/upload");
// 得到文件上传是生成的临时文件夹,将文件的缓冲放在这个目录
String tempPath = this.getServletContext.getRealPath("WEB-INF/emp");
// 判断一下缓冲文件是否存在
File tempFile = new File(tmpPath);
if(!tempFile.isexists()){
tempFile.miker();
///
//| 使用ServletUploadFile 上传步骤: /
//| 1.创建Factory, /
//| 2.创建解析器, /
//| 3.使用解析器解析表单 /
///
DiskFileItemFactory factory = new DiskFileFactory();
// 设置缓冲区大小,默认为10K,
factory.setSizeThreshol(1024*100);
// 设置缓存文件的保存目录
factory.setRepository(tempFile);
ServletFactoryUpload upload = new ServletFactoryUpload(factory);
// 设置监听器,监听上传进度
upload.setProgressListener(new ProgressListener()){
@Override
public void update(long pBytesRead,long pContentLength,int arg2){
System.out.print("文件上传大小:"+pByetesRead);
}
});
upload.setHeaderEncoding("UTF-8");
// 限制上传文件
upload.setFileSizeMax(1024*1024);
// 设置同时上传文件的总量
upload.setSizeMax(10*1024*1024);
// 用解析器上传数据,返回一个List<FileItem>集合,每一个FileItem对应一个From表单输入项
List<FileItem> list = upload.parseRequest(request);
// 遍历List集合
for(FileItem item : list){
if(item.isFromFiled())
String name = item.getName();
String content = item.getString("UTF-8");
System.out.println("name+content");
} else{
String filename = item.getName();
System.out.println(filename);
// 获得文件的类型
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
System.out.println("文件的类型为:"+fileExtName);
InputStream is = item.getInpuStream();
Sring saveFilename =uuidFilename(String name);
String realSavePath = makePath(saveFilename,savePath);
FileOutputStream out = new FileOutputStream(realSavaPath+"\\"+saveFilename);
FileItem fileItem = fileItem.get(1);
}
// 处理同名文件的方法UUID
private String uuid(String name){
return UUID.randomUUID().toString().replace("-","").toUpperCase()+"_"+filename;
}
// 处理出现太多文件夹
private File makePath(String savaFilename,String savePath){
// 获取文件名生成的哈希值
int hex = filename.hashCode();
// 取哈希值的第四位
String dir1 = Integer.toHexString(hex&0xf);
// 去哈希值的高四位
String dir2 = Integer.toHexString(hex>>>4&0xf);
String newSavePath = savePath+"/"+dir1+"/"+dir2;
//
File file = new File(newSavePath);
if(!file.exists()){
file.mikders();
}
return newSavePath;
}
}