Javaweb文件的上传与下载

文件的上传与下载

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");
    
遇到的问题
  1. 表单没有提交到指定的Servlet,解决的方案:

    -web.xml文件的配置不对。/Servlet

    -注意JSP文件的大小写和默认生成的web.xml中的对应。

  2. 文件上传的位置问题

    -文件上传位置是.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

Servlet的限制
  1. request。getParmatere(“xxx”);这个方法在表单属性为enctype=“multipart、form-data”时,不好使。
  2. ServletInputStream request.getInputStream();获取的整个表单的数据。
通过ServletFileUpload实现文件的上传

使用的JAR包:commons-fileupload.jar和commons-io.jar

  1. 创建工厂:DiskFileItemFactory
    DiskFileItemFactory factory = new DiskFileItemFactory();
  2. 创建解析器:ServletFileUpload
    ServletFileUpload sfu = new ServletFileUpload(factory);
  3. 使用解析器来解析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;
    }
}           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值