文件上传下载

闲来无事,整理一下以前学习过得一些知识,如有什么不妥之处还请赐教

依赖于Apache官方的文件处理jar包其中fileupload依赖于下面的io包

接下来上代码,这里我把功能都写到工具类里方便调用

package util;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;


import javax.servlet.http.HttpServletRequest;


import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class FileUtils {

    //这个是获取from表单中的数据放到map中

     public static Map<String, Object> getInfoByFrom(HttpServletRequest request) throws FileUploadException {
     
    Map<String, Object> map=new HashMap<>();
    List<FileItem> list = null;
DiskFileItemFactory factory=new DiskFileItemFactory();
   ServletFileUpload upload=new ServletFileUpload(factory);
    upload.setHeaderEncoding("UTF-8");
   
    //判断是否为普通表单上传
    if(!ServletFileUpload.isMultipartContent(request)){
    Enumeration<String> e =request.getParameterNames();
    while(e.hasMoreElements()){
    String iv=e.nextElement();
    map.put(iv, request.getParameter(iv));
    }
   
    }else{
   
list = upload.parseRequest(request);//这里我把异常抛出方便上传失败的处理

   
    for (FileItem fileItem : list) {
if(fileItem.isFormField()){

                  
                   
try {
map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));//                           解决普通输入项的数据的中文乱码问题
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
                    
}else{
String filename = fileItem.getName();
                     if(filename==null || filename.trim().equals("")){
                         continue;
                     }
                    //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
                     //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                     
                     filename = filename.substring(filename.lastIndexOf("\\")+1);
                   
                     

                     
                     try {
     InputStream in=fileItem.getInputStream();

                    map.put(filename, in);
map.put(filename+"_size", fileItem.getSize());//文件大小(规定其名字为  文件名_size)
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
                    
                      
                     
}
}
    }
    return map;
     }
     public static void sendFile(Object in,String path,byte[] buffer){//支持单个上传
    FileOutputStream out=null;
     
    try {
out = new FileOutputStream(path);
int len = 0;
             //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
             while((len=((FileInputStream) in).read(buffer))>0){//其实in是inputstream类型
                 
                 out.write(buffer, 0, len);
             }
             //关闭输入流
     ((FileInputStream) in).close();
             //关闭输出流
             out.close();
             
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     
     }
     public static String makeFileName(String filename){  
          //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
            return UUID.randomUUID().toString() + "_" + filename;
        }
     public static String  fileNameFilter(String filename){
    filename=filename.replaceAll("[\\\\?*/<>|:\"]", "");//替换文件名中包含的?<>":|/\*非法字符
          if(filename.length()>255){//文件名最长为255
        filename=filename.substring(filename.length()-255,filename.length());
         }
         
    return filename;
     }
     
     public static String makePath(String filename,String savePath){//必须提供根路径
             //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
             int hashcode = filename.hashCode();
             int dir1 = hashcode&0xf;  //0--15 其中&表示与运算0x表示16进制f表示15,(16进制的0-F)
             int dir2 = (hashcode&0xf0)>>4;  //0-15//左移4位
             //构造新的保存目录
             String dir = savePath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5
             //File既可以代表文件也可以代表目录
             File file = new File(dir);
             //如果目录不存在
             if(!file.exists()){
                 //创建目录
                 file.mkdirs();
             }
             return dir;
         }
     public static boolean fileExtName(String ext,String[] abc){//判断文件类型是否合法
for (String string : abc) {
if(ext.equals(string)){
return true;
}
}
    return false;
     }

    

}


//下载的部分就比较容易了,也就不写什么工具类了

String filePath= request.getParameter("url");
File file = new File(filePath);
if(!file.exists()){
//如果文件不存在,在这里写处理方式
 }
//处理文件名,就是要得到真实文件名(通常上传时都会修改文件名)如果不需要请忽视这一步
 String realname = filePath.substring(filePath.indexOf("_")+1);
//设置响应头,控制浏览器下载该文件
 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));//如果不设置消息头的话就是像在传验证码一样了
              //读取要下载的文件,保存到文件输入流
              FileInputStream in = new FileInputStream(file);
             //创建输出流
               OutputStream out = response.getOutputStream();
              //创建缓冲区
              byte buffer[] = new byte[1024];
              int len = 0;
              //循环将输入流中的内容读取到缓冲区当中
                while((len=in.read(buffer))>0){
                //输出缓冲区的内容到浏览器,实现文件下载
              out.write(buffer, 0, len);
               }
               //关闭文件输入流
               in.close();
               //关闭输出流
              out.close();

其中有些内容参考至孤傲苍狼大佬的文章

https://www.cnblogs.com/xdp-gacl/p/4200090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值