文件的上传和下载绝对路径

上传 存的是结对路径D:\tomct.......

/**
  * @Description: 生成上传文件的文件名,文件名以时间+3位随机数+"_"+文件的原始名称
  * @param filename
  *            文件的原始名称
  * @return 时间+3位随机数+"_"+文件的原始名称
  */
 private String makeFileName(String filename) { // 2.jpg
  // 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
  // return UUID.randomUUID().toString() + "_" + filename;
  // 日期格式化
  DateFormat df = new SimpleDateFormat("yyyyMMddhhmmssSSS");
  // 当前的时间
  String name = df.format(new Date());

  // 三位的随机数
  Random r = new Random();
  // name=时间+三位的随机数
  for (int i = 0; i < 3; i++) {
   name += r.nextInt(10); // +=会自动的将int转换为string
  }

  return name + "_" + filename;

 }

 

 /**
  * 为防止一个目录下面出现太多文件,要使用hash算法打散存储
  *  使用"/" 支持linux系统
  * @param filename
  *            文件名,要根据文件名生成存储目录
  * @param savePath
  *            文件存储路径 
  * @return 新的存储目录
  */
  private String makePath(String filename,String savePath){
     //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
     int hashcode = filename.hashCode();
     int dir1 = hashcode & 0xf; //0--15
     int dir2 = (hashcode & 0xf0)>>4; //0-15
     //构造新的保存目录
     String dir = savePath + "/" + dir1 + "/" + dir2+"/"; //upload\2\3 upload\3\5
     //File既可以代表文件也可以代表目录  
     File file = new File(dir);
    //如果目录不存在
     if(!file.exists()){
      //创建目录
      file.mkdirs();
    }
     return dir;
       String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
      File root = new File(savePath);
      if (!root.exists()) {
       //创建临时目录
       root.mkdir();
      }
         InputStream is = new FileInputStream(file);
         //得到上传文件的扩展名 .xle
         String fileExtName = fileFileName.substring(fileFileName.lastIndexOf(".")+1);
     
         //得到文件的真实的保存目录
         String realSavePath = makePath(fileFileName, savePath);
         //修改文件的存储名字,防止文件多了出现重名保存失败
        String  storeName = makeFileName(fileFileName);
        
         //创建一个文件输出流
         OutputStream os = new FileOutputStream(realSavePath + "/" + storeName);
        
         byte[] buffer = new byte[1024];
         int length = 0;
        
         while(-1 != (length = is.read(buffer, 0, buffer.length)))
         {
           os.write(buffer);
         }
         os.close();
         is.close();
       
     //数据库存储的字段和名字
     String  urlAndName = realSavePath +storeName ;
     notice.setAttachment(urlAndName);
     
        }catch (Exception e) {
     
          e.printStackTrace();
          return SUCCESS ;
        } 

 

下载 文件

public String download() throws ServletException, Exception {
  HttpServletRequest req = ServletActionContext.getRequest();
  Long id = Long.parseLong(req.getParameter("id"));
  noticeQuery.setId(id);
  System.out.println();
  // 获取文件的全名和绝对磁盘地址
  Notice notice = noticeService.selectByPrimaryKey(noticeQuery.getId());
  // String urlAndName = kbm.getKbmAdjunct();
  String urlAndName = notice.getAttachment();
  // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
   String url = urlAndName.substring(0, urlAndName.lastIndexOf("/"));
         String storeName =  urlAndName.substring( urlAndName.lastIndexOf("/")+1);
         String realName = storeName.substring(storeName.indexOf("_")+1);
  // 上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
  File file = new File(url + "/" + storeName);
  // 如果文件不存在
  if (!file.exists()) {
   // 错误提示
  
      this.getServletResponse().setCharacterEncoding("utf-8");
            this.getServletResponse().getWriter().write("您要下载的资源已被删除!!");
//   servletRequest.setAttribute("message", "您要下载的资源已被删除!!");
//   servletRequest.getRequestDispatcher("/message.jsp").forward(
//     servletRequest, servletResponse);
   return "";
  }

  // 处理文件名
  // String realname = fileStoreName.substring(fileStoreName.indexOf("_")
  // + 1);
  // 设置响应头,控制浏览器下载该文件
  servletResponse.setHeader("content-disposition", "attachment;filename="
    + URLEncoder.encode(realName, "UTF-8"));
  // 读取要下载的文件,保存到文件输入流
  FileInputStream in = new FileInputStream(file);
  // 创建输出流
  OutputStream out = servletResponse.getOutputStream();
  byte buffer[] = new byte[1024];
  int len = 0;
  // 循环将输入流中的内容读取到缓冲区当中
  while ((len = in.read(buffer)) > 0) {
   // 输出缓冲区的内容到浏览器,实现文件下载
   out.write(buffer, 0, len);
  }
  // 关闭文件输入流
  in.close();
  // 关闭输出流
  out.close();
  return NONE;

 }

转载于:https://www.cnblogs.com/xiaolaoda/p/7027158.html

文件上传漏洞是指在网站或应用程序中存在漏洞,使得攻击者可以上传恶意文件到服务器上。通过利用文件上传漏洞,攻击者可以执行任意代码,获取服务器权限,或者在服务器上执行其他恶意操作。 要找到文件上传漏洞的绝对路径,可以通过以下步骤进行: 1. 首先,尝试上传一个文件,观察上传文件是否被服务器接受并保存。如果上传成功,可以尝试修改文件的扩展名或内容,以绕过服务器的文件类型检查。这样可以确保上传文件能够被服务器执行。 2. 上传成功后,需要找到上传文件绝对路径。可以通过查看上传文件的URL或文件路径来获取。通常,上传文件会被保存在服务器的特定目录中,可以通过查看服务器配置文件或应用程序代码来确定上传文件的保存路径。 3. 一旦找到上传文件绝对路径,可以使用蚁剑等工具来连接服务器并执行代码。通过连接服务器,可以利用上传文件执行任意代码,获取服务器权限或进行其他操作。 需要注意的是,为了使上传文件能够被服务器执行,通常需要将文件的扩展名修改为服务器支持的脚本语言类型,如PHP。这样服务器在执行文件时会将其作为脚本来解析并执行其中的代码。 总结起来,要找到文件上传漏洞的绝对路径,需要通过上传文件并修改扩展名或内容来绕过服务器的文件类型检查,然后查找上传文件的保存路径,并使用相应的工具连接服务器并执行代码。 #### 引用[.reference_title] - *1* *2* *3* [文件上传漏洞详解](https://blog.youkuaiyun.com/2301_76160896/article/details/131215650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值