手把手搭建Java共享网盘的方法步骤

项目介绍

在线共享网盘采用jsp+servlet搭建项目结构实现共享网盘,项目分为管理员,普通用户和付费用户三种角色,根据不同角色控制不同权限,实现不同用户对个人文件文件,所有文件,共享文件的增删改查操作。

项目适用人群

正在做毕设的学生,或者需要项目实战练习的Java学习者

开发环境:

  • jdk 8
  • intellij idea
  • tomcat 8.5.40
  • mysql 5.7

所用技术:

  • jsp+servlet
  • js+ajax
  • layUi
  • jdbc直连

项目访问地址

http://localhost:8090

项目结构

项目截图

注册

我的网盘

我的共享

回收站

会员充值

管理员-所有文件

管理员-共享申请

关键代码:

1.初始化工作

//数据库连接初始化
public class DBInfo {
  String url = null;
  String username = null;
  String password = null;
  String driverClass = null;

  private static DBInfo db = new DBInfo();

  public static DBInfo getInstance(){
    return db;
  }

  private DBInfo() {
    InputStream in = this.getClass().getClassLoader().getResourceAsStream("db.properties");
    Properties pp = new Properties();
    try {
      pp.load(in);
      url = pp.getProperty("jdbc.url");
      username = pp.getProperty("jdbc.username");
      password = pp.getProperty("jdbc.password");
      driverClass = pp.getProperty("jdbc.driver");

      Class.forName(driverClass);
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      try {
        in.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  public Connection getConnection(){
    Connection conn = null;
    try {
      conn = DriverManager.getConnection(url, username, password);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return conn;
  }
}
//上传资源初始化
public void init() throws ServletException {
  super.init();
  //servlet启动时 ,读取配置文件中关于上传的信息
  InputStream in = this.getClass().getClassLoader().getResourceAsStream("ini.properties");
  Properties pp = new Properties();
  try {
    pp.load(in);
    UPLOAD_ROOT_PATH = pp.getProperty("upload.path");
    String tmpPath = pp.getProperty("tmp.path");
    //配置上传临时目录
    factory = new DiskFileItemFactory(1024*1024*10,new File(tmpPath));
    stu = new ServletFileUpload(factory);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    try {
      in.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

2.资源上传

//前端JSP代码
<div class="modal fade" id="uploadModal" tabindex="-1" role="dialog" aria-labelledby="uploadFile" aria-hidden="true">
    <form action="upload" method="post" enctype="multipart/form-data">
      <input type="hidden" name="from" value="user">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
            <h4 class="modal-title" id="uploadFile">上传文件</h4>
          </div>
          <div class="modal-body">
            <input type="file" name="file" value="上传文件">
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">
              关闭
            </button>
            <input type="submit" class="btn btn-primary" value="确定上传"/>
          </div>
        </div>
    </form>
  </div>
//后端入库处理
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws  IOException {
  User user = (User) request.getSession().getAttribute(Const.SESSION_USER);
  String from="";
  try {
    List<FileItem> fileItemLists = stu.parseRequest(request);
    for(FileItem fileItem : fileItemLists){
      if(fileItem.isFormField()){
        from = fileItem.getString();
      }else{
        //上传文件名
        String fileName = fileItem.getName();
        String oldfilename = fileItem.getName();
        int index = fileName.lastIndexOf("\\");
        if(index != -1) {
          fileName = fileName.substring(index+1);
        }
        String root = UPLOAD_ROOT_PATH+user.getUsername();
        //获取文件大小
        long size = fileItem.getSize();
        String sizeString = StringUtil.computeSize(size);
        Timestamp upTime = new Timestamp(new Date().getTime());
        File file = new File(root,fileName);

        //解决文件同名
        int cnt = 1;
        while(file.exists()){
          StringBuffer sb = new StringBuffer(fileName);
          sb.insert(sb.lastIndexOf("."), "("+cnt+")");
          file = new File(root,sb.toString());
          cnt++;
        }
        //文件路径是否存在
        if(!file.getParentFile().exists()){
          file.getParentFile().mkdirs();
        }
        try {
          fileItem.write(file);
          //上传成功,数据库保存记录
          UserFile userFile = new UserFile();
          userFile.setCreateTime(upTime);
          userFile.setFilename(file.getName());
          userFile.setFilename(file.getName());
          userFile.setFileSize(sizeString);
          userFile.setIsShared(0);
          userFile.setOwnerId(user.getId());
          userFile.setPath(file.getAbsolutePath());
          userFile.setOldfilename(oldfilename);
          userFileDao.save(userFile);
          response.sendRedirect(from+"?action=mydisk");
        } catch (Exception e) {
          e.printStackTrace();
          response.getWriter().print("上传出错");
        }
      }
    }
  } catch (FileUploadException e) {
    e.printStackTrace();
    response.setContentType("text/html; charset=utf8");
    response.getWriter().print("上传出错!!");
  }
}

3.检索重复上传的资源

//这里上传在上面上传资源时候,将保存原始资源名字
public List<UserFile> findRetrieveListByOwnerId(int ownerId,int isDelete){
  List<UserFile> fileList = new ArrayList<UserFile>();
  Connection conn = db.getConnection();
  PreparedStatement ps = null;
  ResultSet rs = null;
  UserFile userFile = null;
  String sql="select * from file where oldfilename in ( " +
      " select a.oldfilename from (select oldfilename,count(id) counts from file GROUP BY oldfilename HAVING counts>1) a" +
      " ) and ownerid=? and isDelete=?";
  ps = conn.prepareStatement(sql);
  ps.setInt(1, ownerId);
  ps.setInt(2, isDelete);
  rs = ps.executeQuery();
  while(rs.next()){
    userFile = new UserFile();
    userFile.setId(rs.getInt(1));
    userFile.setFilename(rs.getString(2));
    userFile.setPath(rs.getString(3));
    userFile.setCreateTime(rs.getTimestamp(4));
    userFile.setIsShared(rs.getInt(5));
    userFile.setOwnerId(rs.getInt(6));
    userFile.setFileSize(rs.getString(7));
    userFile.setCounts(rs.getInt(8));
    userFile.setSharedReason(rs.getString("SharedReason"));
    userFile.setSharedTime(rs.getString("SharedTime"));

    fileList.add(userFile);
  }
  return fileList;
}

4.平台会员充值

//前端jsp代码
<body>
  <div id="wrapper">
    <%@include file="common/nav.jsp" %>
    <div id="page-wrapper">
      <div class="">
    <div class="col-md-12">
      <h1 class="margin-bottom-15">以下是微信付款码,扫码即可支付</h1>
      <div class="form-group">
        <div class="col-md-12">
          <div class="control-wrapper">
            <div class="text-center" id="div1">
              <input type="submit" value="扫码付款" class="btn btn-success">
            </div>
            <div class="text-center" id="div2" style="display: none;">
              <input type="submit" value="恭喜您,完成扫码支付!"class="btn btn-warning">
            </div>
          </div>
          <div class="text-center">
            <font color="green">${msgSuccess }</font>
            <font color="red">${msgFail }</font>
          </div>
        </div>
      </div>
      <form class="form-horizontal templatemo-container templatemo-login-form-1 margin-bottom-30" role="form" action="user" method="post">
        <input type="hidden" name="action" value="editSubmit">
        <div class="form-group">
         <img src="static/image/pay.png" alt="平台会员充值码" style="width: 81%; padding-left: 24%;">
        </div>
       </form>
    </div>
  </div>
    </div>
  </div>
</body>
//js实现,采用定时跳转模拟真实用户支付流程,后续进行改动用户会员状态
var test1 = setTimeout(function(){
  $("#div1").css("display","none");
  $("#div2").css("display","block");
  layer.msg('恭喜您,完成扫码支付!', {time: 4000, icon:6},function () {
    window.location.href="user?action=doTopUp";
  });
  clearTimeout(test1);
},5000);
//后端代码
public void doTopUp(User user) {
  Connection conn = db.getConnection();
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
    //members=1为会员状态
    ps = conn.prepareStatement("update user set members = 1 where id = ?");
    ps.setInt(1, user.getId());
    ps.execute();
  } catch (SQLException e) {
    e.printStackTrace();
  } finally {
    try {
      if (conn != null)
        conn.close();
      if (ps != null)
        ps.close();
      if (rs != null)
        rs.close();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

项目后续

其他ssh,ssm,springboot版本后续迭代更新,持续关注

到此这篇关于手把手搭建Java共享网盘的方法步骤的文章就介绍到这了,更多相关Java搭建共享网盘内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 存储模型和共享对象详解

    Java 存储模型和共享对象详解 很多程序员对一个共享变量初始化要注意可见性和安全发布(安全地构建一个对象,并其他线程能正确访问)等问题不是很理解,认为Java是一个屏蔽内存细节的平台,连对象回收都不需要关心,因此谈到可见性和安全发布大多不知所云.其实关键在于对Java存储模型,可见性和安全发布的问题是起源于Java的存储结构. Java存储模型原理 有很多书和文章都讲解过Java存储模型,其中一个图很清晰地说明了其存储结构: 由上图可知, jvm系统中存在一个主内存(Main Memory或J

  • Java编程多线程之共享数据代码详解

    本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保证各个线程的数据不交叉:一是多个线程间如何共享数据,保证数据的一致性. 线程范围内共享数据 自己实现的话,是定义一个Map,线程为键,数据为值,表中的每一项即是为每个线程准备的数据,这样在一个线程中数据是一致的. 例子 package com.iot.thread; import java.util.HashMap; import java.util.Map; import java.util.Random; /*

  • Java多线程编程之访问共享对象和数据的方法

    多个线程访问共享对象和数据的方式有两种情况: 1.每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享. 2.每个线程执行的代码不同,例如:设计四个线程,其中两个线程每次对j增加1,另外两个线程每次对j减少1. a.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个对象中有共享数据.卖票就可以这样做,每个窗口都在做卖票任务,卖的票都是同一个数据(点击查看具体案例). b.如果每个线程执行的代码不同,就需要使用不同的Runnable对象,有

  • Java中tomcat memecached session 共享同步问题的解决办法

    事件缘由:一个主项目"图说美物",另外一个子功能是品牌商的入驻功能,是跟主项目分开的项目,为了共享登录的用户信息,而实现session共享,俩个tomcat,一个tomcat6,一个tomcat7 web项目windows系统下实现session的共享 第一个步: 在俩个tomcat的context.xml这个文件中配置如下代码: <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManage

  • java实现Runnable接口适合资源的共享

    本文为大家分享了java实现Runnable接口适合资源的共享,供大家参考,具体内容如下 Java当中,创建线程通常用两种方式: 1.继承Thread类 2.实现Runnable接口 但是在通常的开发当中,一般会选择实现Runnable接口,原因有二: 1.避免单继承的局限,在Java当中一个类可以实现多个接口,但只能继承一个类 2.适合资源的共享 原因1我们经常听到,但是2是什么呢?下面用一个例子来解释: 有5张票,分两个窗口卖: 继承Thread类: public class ThreadD

  • Java使用wait() notify()方法操作共享资源详解

    Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁,或者叫管程) 3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程: 4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线

  • Java线程重复执行以及操作共享变量的代码示例

    1.题目:主线程执行10次,子线程执行10次,此过程重复50次 代码: package com.Thread.test; /* * function:主线程执行10次,子线程执行10次, * 此过程重复50次 */ public class ThreadProblem { public ThreadProblem() { final Business bus = new Business(); new Thread(new Runnable() { public void run() { for

  • Java远程共享目录的操作代码

    一.前言 根据客户反馈,在进行文件下载的时候,新增远程共享目录,下载对应的文件到远程共享目录,采用常用的IO操作模式,提示下载成功,但是客户去远程共享目录查看对应的下载文件,反馈说没有找到对应的文件.要求系统需要支持上传远程共享目录,为什么有一个这样的需求?由于下载的文件涉及到了支付文件,里面的金额不允许进行修改,如果放在本地路径有可能会不会出现人为的修改,一般涉及到钱的问题,客户都是比较谨慎的,刚好没有接触过操作远程共享目录的,就google了一下看有没有对应的操作说明,下面简单总结一下. 二

  • java通过共享变量结束run停止线程的方法示例

    stop()方法已经被弃用,原因是不太安全.API文档中给出了具体的详细解释.通过interrupted()方法打断线程.不推荐.通过共享变量结束run()方法,进而停止线程.如实例 复制代码 代码如下: public class ThreadInterrupt {    public static void main(String []args){        Runner run = new Runner();        run.start();        try {       

  • 手把手搭建Java共享网盘的方法步骤

    项目介绍 在线共享网盘采用jsp+servlet搭建项目结构实现共享网盘,项目分为管理员,普通用户和付费用户三种角色,根据不同角色控制不同权限,实现不同用户对个人文件文件,所有文件,共享文件的增删改查操作. 项目适用人群 正在做毕设的学生,或者需要项目实战练习的Java学习者 开发环境: jdk 8 intellij idea tomcat 8.5.40 mysql 5.7 所用技术: jsp+servlet js+ajax layUi jdbc直连 项目访问地址 http://localhos

  • 使用docker安装部署NextCloud私人网盘的方法步骤

    目录 1.查询并下载NextCloud镜像 2.创建并启动NextCloud容器 3.访问NextCloudWEB界面 4.参考链接 1.查询并下载NextCloud镜像 执行命令 docker search nextcloud docker pull nextcloud 演示操作 # 查询nextcloud镜像 [root@docker ~]# docker search nextcloud NAME DESCRIPTION STARS OFFICIAL AUTOMATED nextcloud

  • 利用docker部署nextcloud 网盘的方法步骤

    NextCloud 你可以在自己的计算机上共享任何文件或文件夹,并将它们与 NextCloud 服务器同步.当你把文件放入共享目录,这些文件就会立即同步到 NextCloud 服务器以及所有相关联的 NextCloud / ownCloud 桌面客户端.Android 客户端或 iOS 客户端. 安装docker yum install docker-io -y docker -v // 查看版本 systemctl start docker // 启动 docker systemctl ena

  • Java如何搭建一个个人网盘

    目录 前言 一.项目介绍 二.网盘搭建 2.1 Windows 环境运行 2.2 Linux 环境运行 三.开发环境运行 3.1 下载项目 3.2 运行 3.3 阅读代码 四.功能说明 4.1 上传 4.2 视频/音频播放 4.3 快捷键使用 4.4 配置文件修改 4.5 在线预览 4.6 分享下载链接 五.最后 前言 本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 网盘项目. 今天给大家带来一款开源 Java 版网盘项目-- kiftd-source,本文将用 3 分钟带

  • linux下使用Docker和OSS轻松搭建ownCloud专属网盘(网盘关闭不用怕)

    文件共享是团队协作的刚需,面对说停就停的网盘服务,很多同学除了心塞已经开始盘算搭建自己的网盘应用了. ownCloud 是一个开源免费的存储管理工具,它能帮你快速架设一套专属的网盘服务,可以像 Dropbox 那样实现文件跨平台同步.共享.版本控制.团队协作等等. 然而在VPS上搭建ownCloud是一件费时费力的工作,除此之外更需要考虑数据的可靠性.备份等工作. 本文将利用阿里云容器服务在几分钟内轻松搭建一个基于Docker的ownCloud专属网盘,并使用阿里云提供的OSS(Object S

  • 搭建docker内网私服的方法(docker-registry with nginx&ssl on centos)

    本文介绍了搭建docker内网私服的方法,分享给大家.具体如下: 主要思路: 1. Docker Registry 说明 关于如何创建和使用本地仓库,其实已经有很多文章介绍了.因为docker技术正处于发展和完善阶段,所以有些文章要么内容已经过时,要么给出了错误的配置,导致无法正常创建仓库.本文记录的是个人完整的搭建过程,docker version为1.1.2. 官方提供了Docker Hub网站来作为一个公开的集中仓库.然而,本地访问Docker Hub速度往往很慢,并且很多时候我们需要一个

  • 用Docker搭建nextcloud个人网盘教程

    目录 一.简介 二.部署环境 三.工具 四.部署过程 总结 一.简介 nextcloud是一个非常好用的网盘系统,功能强大插件齐全,非常适用于个人网盘和企业网盘搭建. 二.部署环境 服务器系统:CentOS7 Docker版本:20.10.10 三.工具 使用工具:Docker 20.10.10 四.部署过程 1.宿主机新建Nextcloud文件夹,Nextcloud文件夹用于映射Nextcloud容器的存储路径. mkdir -p /home/docker/nextcloud 2.搭建mysq

  • idea2020.1.3 手把手教你创建web项目的方法步骤

    首先: IDEA中的项目(project)与eclipse中的项目(project)是不同的概念,IDEA的project 相当于之前eclipse的workspace,IDEA的Module是相当于eclipse的项目(project). 第一步:配置tomcat (1)点击run下面的edit configuration (2)点击template左边的三角 (3)找到Tomcat Server,有两个选项,第一个表示本地的,第二个表示远程的.这里我们因为在自己电脑,选择本地的 (4)点击c

  • Linux搭建C++开发调试环境的方法步骤

    安装g++ Linux编译C++程序必须安装g++编译器.这里使用yum方式安装.首先切换到root账号,su - root 然后输入密码. 执行yum install gcc-c++(注意不是yum install g++),报错. 报错是因为yum需要配置正确的服务器地址,服务器是提供yum安装包的,也被称作yum源.配置yum源的配置文件在/etc/yum.repos.d/目录下,可以看到系统自带了两个文件. cat 文件名称,会打印文件全部内容.可以看到两个文件要么没配置,要么地址是无法

  • Java自动生成编号的方法步骤

    在新增数据时,往往需要自动生成编号.下面就以我的编号来说. 我的编号格式为:SR+日期(8位)+编号(3位). 其中,日期为系统当前的日期.首先获取系统当前日期,然后根据日期格式将date类型转换成String类型即可. SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");//设置日期格式 String date = f.format(new Date(System.currentTimeMillis())); 后三位编号根据数据

随机推荐