您的位置:首页 > 编程语言 > Java开发

Javaweb文件的上传与下载

2016-05-18 21:43 399 查看

文件的上传与下载

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: