Python实现基于HDFS的云盘系统

  • 一.云盘系统
  • 二.功能需求
    • 2.1.用户管理
    • 2.2.文件管理
    • 2.3.界面设计
  • 三.用户代码
    • 3.1 用户登录
    • 3.2 用户注册
    • 3.3 用户退出
  • 四.文件代码
    • 4.1 上传打开本地窗口
    • 4.2 下载并命名显示本地窗口
    • 4.3 下载文件
    • 4.4 移动文件
    • 4.5 删除文件
    • 4.6 创建文件
    • 4.7 上传文件
    • 4.8 鼠标双击事件重命名
    • 4.9 右键菜单
  • 五.代码下载

一.云盘系统

云盘系统通过互联网为企业和个人提供信息的存储、读取、下载等服务。具有安全稳定、海量等特点。目前,云盘系统逐步走向成熟,特别是公有云盘能够向用户提供免费存储,,离线下载,文件智能分类等功能。随着互联网的不断普及,用户存储在云盘上的数据量越来越大,数据类型页越来越多样化,不仅有传统的文本文件,二进制文件,还有视频,音频,图像,图片等。这些数据不仅类型繁多,而且数据量普遍庞大。例如,一个视频文件可能高达几个G甚至几十个G。因此充分利用大数据平台的优势,可以为云盘提供一套适合上述特点的底层环境。
本题目要求开发一个基于HDFS的云盘系统来实现云盘的基本数据存储和访问功能。

二.功能需求

2.1.用户管理

用户的注册,登录,退出。注册成功时需要将用户信息写入数据库,并在HDFS中建立用户的专属目录。

2.2.文件管理

提供文件上传,下载,浏览,删除等功能。提供目录的管理,可以创建目录,复制或移动文件或目录到指定目录下面;可以删除目录。删除目录时需要给出提示。提供文件搜索功能。

2.3.界面设计

为系统设计并实现主界面,基于窗口或基于浏览器均可。所有操作均在人机交互界面中完成。

三.用户代码

引用所需要 用到的库函数

from hdfs import *
import os
import os.path
import tkinter.filedialog
import tkinter as tk
from PIL import Image,ImageTk
import tkinter.messagebox
import pickle
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
from tkinter import ttk
import time
import sys
from pyhdfs import HdfsClient
from tkinter import filedialog
from tkinter.filedialog import askdirectory
from pathlib import Path
from hdfs3 import HDFileSystem

Client—创建集群链接

client=Client('http://47.112.220.22:9870')

3.1 用户登录

登录函数python代码:

def usr_log_in():#输入框获取用户名密码usr_name=var_usr_name.get()usr_pwd=var_usr_pwd.get()#从本地字典获取用户信息,如果没有则新建本地数据库try:with open('usr_info.pickle','rb') as usr_file:usrs_info=pickle.load(usr_file)except FileNotFoundError:with open('usr_info.pickle','wb') as usr_file:usrs_info={'admin':'admin'}pickle.dump(usrs_info,usr_file)#判断用户名和密码是否匹配if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:str=tk.messagebox.showinfo(title='welcome',message='欢迎您:'+usr_name)#文件窗口if str=='ok':window.destroy()main_face(usr_name)else: tk.messagebox.showerror(message='密码错误')#用户名密码不能为空elif usr_name=='' or usr_pwd=='' :tk.messagebox.showerror(message='用户名或密码为空')#不在数据库中弹出是否注册的框else:is_signup=tk.messagebox.askyesno('欢迎','您还没有注册,是否现在注册')if is_signup:usr_sign_up()

3.2 用户注册

注册函数python代码:

def usr_sign_up():#确认注册时的相应函数def signtowcg():#获取输入框内的内容nn=new_name.get()np=new_pwd.get()npf=new_pwd_confirm.get()#本地加载已有用户信息,如果没有则已有用户信息为空try:with open('usr_info.pickle','rb') as usr_file:exist_usr_info=pickle.load(usr_file)except FileNotFoundError:exist_usr_info={}           #检查用户名存在、密码为空、密码前后不一致if nn in exist_usr_info:tk.messagebox.showerror('错误','用户名已存在')elif np =='' or nn=='':tk.messagebox.showerror('错误','用户名或密码为空')elif np !=npf:tk.messagebox.showerror('错误','密码前后不一致')#注册信息没有问题则将用户名密码写入数据库else:exist_usr_info[nn]=npwith open('usr_info.pickle','wb') as usr_file:pickle.dump(exist_usr_info,usr_file)str2=tk.messagebox.showinfo('欢迎','注册成功')if str2=="ok":client.makedirs('/user/hadoop/cloudpan/'+new_name.get())client.makedirs('/user/hadoop/cloudpan/'+new_name.get()+'/我的文档')#注册成功关闭注册框window_sign_up.destroy()#新建注册界面window_sign_up=tk.Toplevel(window)window_sign_up.geometry('350x200')window_sign_up.title('注册')#用户名变量及标签、输入框new_name=tk.StringVar()tk.Label(window_sign_up,text='用户名:').place(x=10,y=10)tk.Entry(window_sign_up,textvariable=new_name).place(x=150,y=10)#密码变量及标签、输入框new_pwd=tk.StringVar()tk.Label(window_sign_up,text='请输入密码:').place(x=10,y=50)tk.Entry(window_sign_up,textvariable=new_pwd,show='*').place(x=150,y=50)    #重复密码变量及标签、输入框new_pwd_confirm=tk.StringVar()tk.Label(window_sign_up,text='请再次输入密码:').place(x=10,y=90)tk.Entry(window_sign_up,textvariable=new_pwd_confirm,show='*').place(x=150,y=90)    #确认注册按钮及位置bt_confirm_sign_up=tk.Button(window_sign_up,text='确认注册',command=signtowcg)bt_confirm_sign_up.place(x=150,y=130)

3.3 用户退出

推出函数python代码:

def usr_sign_quit():window.destroy()

四.文件代码

4.1 上传打开本地窗口

上传打开本地窗口函数python代码:

def load_window():root = tk.Tk()root.withdraw()path=filedialog.askopenfilename()return path

4.2 下载并命名显示本地窗口

下载并命名显示本地窗口函数python代码:

#下载并命名显示本地窗口
def savefile_window():root = tk.Tk()root.withdraw()name=filedialog.asksaveasfilename()return name

4.3 下载文件

下载文件函数python代码:

# 下载文件
def get_from_hdfs(path):address=savefile_window()#调用保存文件窗口client.download(path,address)

4.4 移动文件

移动文件函数python代码:

def movefile(path,username):for item in tree.selection():entryedit = tk.Entry(frm)entryedit.pack()def move():client.rename(path[-3],path[-2]+'/'+entryedit.get()+'/')b1 = tk.Button(frm1,text="move",width=15,height=30,command=move)b1.pack(padx=30,pady=10,side='right')

4.5 删除文件

删除文件函数python代码:

 # 删除文件def delete_file(path,username):if path!=rootPath1:  #操作非根目录try:client.delete(path)window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='操作成功!')main_face(username)except:tk.messagebox.showinfo(title='提示', message='文件夹不为空!')else:#提示根目录不能删除root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='此目录不能删除!')main_face(username)

4.6 创建文件

创建文件函数python代码:

 # 创建文件def new_dir(path,username):if(client.status(path)['type'] == 'DIRECTORY'):#如果是文件夹就执行root=tk.Tk()root.title('创建文件夹')dir_name=tk.StringVar(root,value='')tk.Label(root,text='名称:').place(x=10,y=10)tk.Entry(root,textvariable=dir_name).place(x=30,y=10)def get_dir_name():dir_names = dir_name.get()client.makedirs(path+'/'+dir_name.get(),permission=777)root.destroy()window.destroy()root1 = tkinter.Tk()root1.withdraw()tk.messagebox.showinfo(title='提示', message='操作成功!')main_face(username)tk.Button(root,text='确定',command=get_dir_name).place(x=150,y=10)else:#否则不执行window.destroy()root2 = tkinter.Tk()root2.withdraw()tk.messagebox.showinfo(title='提示', message='操作失败!')main_face(username)

4.7 上传文件

上传文件函数python代码:

# 上传文件def put_to_hdfs(path,username):address=load_window()if address=='':#点击取消之后执行window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='请选择文件!')main_face(username)else:#点击文件之后执行filename=os.path.basename(address)if  filename in client.list(path[-2]):              window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='文件已存在!')main_face(username)else:if(client.status(path[-1])['type'] == 'DIRECTORY'): #上传到文件夹中client.upload(path[-1],address)window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='操作成功!')main_face(username)else:#上传到根目录client.upload(path[-2],address)window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='操作成功!')main_face(username)

4.8 鼠标双击事件重命名

鼠标双击事件重命名函数python代码:

 # 鼠标双击事件重命名def newname(oldname,username):for item in tree.selection():entryedit = tk.Entry(frm)entryedit.pack()def save():rename = entryedit.get()if rename=='':#名字为空执行window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='名称为空!')main_face(username)else:#名字不为空执行if  rename in client.list(oldname[-2]):    #名字已存在执行          window.destroy()root = tkinter.Tk()root.withdraw()tk.messagebox.showinfo(title='提示', message='名称已存在!')main_face(username)else:#名字不存在执行client.rename(oldname[-1],oldname[-2]+'/'+rename)window.destroy()root1 = tkinter.Tk()root1.withdraw()tk.messagebox.showinfo(title='提示', message='操作成功!')main_face(username)b = tk.Button(frm1,text="save",width=15,height=30,command=save)b.pack(padx=30,pady=10,side='right')

4.9 右键菜单

右键菜单函数python代码:

#右键菜单def button_menu(event):for item in tree.selection():item_values = tree.item(item, "values") menu = tk.Menu(tree,tearoff=0)menu.add_command(label="重命名",command=lambda:newname(item_values,username))menu.add_command(label="删除",command=lambda:delete_file(item_values[-1],username))menu.add_command(label="下载",command=lambda:get_from_hdfs(item_values[-1]))menu.add_command(label="新建文件夹",command=lambda:new_dir(item_values[-2],username))menu.add_command(label="新建到当前目录",command=lambda:new_dir(item_values[-1],username))menu.add_command(label="上传",command=lambda:put_to_hdfs(item_values,username))menu.add_command(label="移动",command=lambda:movefile(item_values,username))def postmenu(event):menu.post(event.x_root,event.y_root)tree.bind('<Button-3>',postmenu)

五.代码下载

我已将代码上传至CSDN,对代码感兴趣的小伙伴,可以点击链接下载 HDFS.zip。

Python实现基于HDFS的云盘系统相关推荐

  1. 基于Hadoop的云盘系统客户端技术选型说明

    伴随云计算技术的发展,云盘系统不断涌现,百度.360.金山等都推出了各自的云盘产品,而云盘存储的模式也越来越被用户所接受,也有越来越多的公司跃跃欲试,想在云存储领域大展拳脚,有一番作为.但是开源Had ...

  2. 基于HDFS实现的简易云盘系统

    文章目录 前言 一.实验简介 二.分析与设计 1. 功能需求分析: 2. 系统设计 三.效果展示 四.环境配置 五.功能实现 1. 基础部分 2. 用户管理 3. 文件管理 六.项目资源 七.其他 八 ...

  3. Python个人网盘源码、云盘系统源程序,基于Django+Mysql

    Python个人网盘源码.云盘系统源程序,基于Django+Mysql 1.安装依赖 pip install -r requirements.txt 2.检查配置文件,修改邮箱和数据库配置 # myc ...

  4. 基于Hadoop开发网络云盘系统架构设计方案第一稿

    引言 云计算技术的发展,各种网络云盘技术如雨后春笋,层出不穷,百度.新浪.网易都推出了自己的云盘系统,本文基于开源框架Hadoop设计实现了一套自己的网络云盘系统,方案为初步设计方案,不断完善中. 一 ...

  5. 基于springBoot的网络云盘系统w008

    开发环境:idea+mysql+tomcat 视频演示:「基于springBoot的云盘分享系统w008.mp4」https://www.aliyundrive.com/s/vr1HkMPdtDx 点 ...

  6. 精品分享:基于 SpringBoot + Vue 开发的云盘系统(含大文件断点续传剖析)

    引言 作为开发人员,我们经常需要存储和下载文件,为了使用方便,通常都会将文件存储在云端,市面上使用率最高的云端存储莫过于百度网盘了,但使用别人的东西难免会受到各种各样的限制,必须花钱才会享受到更好的服 ...

  7. 『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现...

    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现 1.基本设定和软件版本 主机名 ip 对应角色 mas ...

  8. 基于 go-zero 实现网盘系统

    基于 go-zero 实现网盘系统 基于 go-zero 实现网盘系统 go-zero 简单使用 数据库分析 用户模块 密码登录 用户详情 鉴权中间件 刷新 Authorization 邮箱注册 测试 ...

  9. 多线程+Socket+MFC界面库实现CS模式的云盘系统

    功能:CS 模式文件上传.下载服务器 + 客户端(轻量级的个人云盘系统) 使用方法: 保证文件夹路径E:\myLibForYunPan\data和E:\myLibForYunPan\download存 ...

最新文章

  1. 游戏开发基础:A*算法(转)
  2. 网站基于文本搜索的实现
  3. maven jetty运行时,js无法保存
  4. 哔哩哔哩公司swot分析_是时候颠覆你的SWOT营销分析法了!TOWS分析法可能更适合你...
  5. 12-文本属性和字体属性
  6. css常用鼠标指针形状代码
  7. Linux 下配置多机实时同步
  8. UI自动化,元素被遮挡
  9. Win7安装MarkdownPad2破解版,报Awesomium.Windows.Controls.WebControl 错误的解决方案
  10. PIC24HJ单片机的UART
  11. 游戏是怎么赚钱的 - 科普篇
  12. Jmeter压力测试实验 (软件测试实验报告)
  13. AWS、Azure等国外云计算如何迁移到国内阿里云上?
  14. 《麦肯锡结构化战略思维》:4大原则 5个步骤,快速了解一个行业
  15. 蓝桥杯 扶老奶奶过街 (逻辑推理)
  16. ffmpeg合并多个MP4视频
  17. 带隙基准及LDO电路
  18. 浙江从小学生就上计算机课,浙江省2012年1月自学考试小学数学教学研究试题
  19. 医院管理系统mysql课程设计_数据库(课程设计)报告(医院管理系统).doc
  20. 如何让moment根据对应时间显示几秒前、几分钟前、几天前?

热门文章

  1. java 注解object_JPA之常用 基本注解
  2. db2判断字符为空_算法之字符串转换为数字
  3. mysql update textl类型_MySQL 字段类型参考
  4. java国际化 英语的标识符_(转)Java 国际化
  5. python资源分配算法_DRL based Resource Allocation Framework
  6. 心理学系列:《乌合之众》读书笔记
  7. mongod: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file:
  8. mysql连接量设置_mysql连接数设置操作方法(Too many connections)
  9. react实现浏览器自动刷新_react调用什么刷新页面
  10. 动态展开所有_动态演示立方体的展开,并且显示11种展开图——GeoGebra制作教程...