def add(self): """新建文件夹 """ params = self.req_params() # 格式验证 add_form = form.Form( form.Textbox('path', self.vnotnullpath), form.Textbox('name', self.vnotnullname, self.vxname, self.vname), ) f = add_form() if not f.validates(): self.resp = {'errno': errno_form, 'msg': f.get_note()} return self.json() path, name = params.path, params.name filepath = fileutil.join_path(self.filedir, path) if not os.path.exists(filepath): self.resp = {'errno': errno_exist, 'msg': '路径不存在'} return self.json() filepath = fileutil.join_path(filepath, name) if os.path.exists(filepath): self.resp = {'errno': errno_exist, 'msg': '文件夹已存在'} return self.json() os.mkdir(filepath) self.resp = {'errno': errno_ok, 'msg': '新建文件夹完成'} return self.json()
def list(self): params = self.req_params() path = params.path filepath = fileutil.join_path(self.filedir, path) try: files = os.listdir(filepath) except OSError, e: self.resp = {'errno': errno_client, 'msg': '路径不存在'} return self.json()
def remove(self): """删除文件(非目录) """ params = self.req_params() path = params.path filepath = fileutil.join_path(self.filedir, params.path) token = web.ctx.session.token userid = auth.decode_token(token)['userid'] quota_li = self.db.query_all("""select used, total, fs_path from quota where user_id='%s'""" % (userid)) if 0 == len(quota_li): self.redirect('error') used = int(quota_li[0]['used']) if os.path.isdir(filepath): try: f_li = fileutil.list_all_files(filepath) # http://www.cnblogs.com/xiaowuyi/archive/2012/05/04/2482113.html # 删除非空目录 shutil.rmtree(filepath) #os.rmdir(filepath) for f in f_li: filepath = fileutil.join_path(self.userdir, f[len(self.filedir):]) used -= self._get_fs_size(filepath, userid) self.db.query("delete from file_system where path='%s' and user_id='%s'" % (filepath, userid)) # 更新存储容量 self.db.query("""update quota set used='%d' where user_id='%s'""" % (used, userid)) self.db.commit() except OSError, e: print 'e.message', e.message self.resp = {'errno': errno_notfound, 'msg': '目录不存在'} self.db.rollback() return self.json() self.resp = {'errno': errno_ok, 'msg': '目录删除完成'} return self.json()
def active(self): """审核通过,激活 """ params = self.req_params() userid = params.id quota_li = self.db.query_all("""select fs_path from quota where user_id='%s'""" % (userid)) self.db.query("""update user set state='%d' where id='%s'""" % (state_activate, userid)) self.db.commit() filepath = fileutil.join_path(self.filedir, quota_li[0]['fs_path']) os.mkdir(filepath) self.resp = {'errno': errno_ok, 'msg': '激活完成'} return self.json()
def remove(self): """删除文件 """ params = self.req_params() path = params.path filepath = fileutil.join_path(self.filedir, path) if os.path.isdir(filepath): self.resp = {'errno': errno_client, 'msg': '无法删除目录'} return self.json() try: os.remove(filepath) except OSError, e: self.resp = {'errno': errno_notfound, 'msg': '文件不存在'} return self.json()
def upload(self): """上传文件,并保存 http://webpy.org/cookbook/fileupload.zh-cn http://webpy.org/cookbook/storeupload.zh-cn http://outofmemory.cn/code-snippet/3286/webpy-upload-file """ try: x = web.input(disk={}) except ValueError: self.resp = {'errno': errno_file_too_large, 'msg': e.message} return self.json() params = self.req_params() path = params.path if 'disk' in x: filepath = x.disk.filename.replace('\\', '/') if not filepath: self.resp = {'errno': 1, 'msg': '请选择文件'} return self.json() filename = filepath.split('/')[-1] # 获取文件大小 # https://groups.google.com/forum/#!topic/webpy/si190XseR30 size = int(web.ctx.env['CONTENT_LENGTH']) token = web.ctx.session.token userid = auth.decode_token(token)['userid'] quota_li = self.db.query_all("""select used, total, fs_path from quota where user_id='%s'""" % (userid)) if 0 == len(quota_li): self.redirect('error') if size + int(quota_li[0]['used']) > int(quota_li[0]['total']): self.resp = {'errno': errno_file_too_large, 'msg': '您的存在空间不足'} return self.json() f = open(fileutil.join_path(fileutil.join_path(self.filedir, path), filename), 'w') f.write(x.disk.file.read()) f.close() userdir = quota_li[0]['fs_path'] size = os.path.getsize(fileutil.join_path(fileutil.join_path(self.filedir, path), filename)) used = int(quota_li[0]['used']) + size filepath = fileutil.join_path(fileutil.join_path(userdir, path), filename) # 更新存储容量 self.db.query("""update quota set used='%d' where user_id='%s'""" % (used, userid)) self.db.query("insert into file_system (name, path, size, create_time, user_id) values('%s', '%s', '%s', '%s', '%s')" % (filename, filepath, size, timeutil.get_current_date(), userid)); self.db.commit() self.resp = {'errno': 0, 'msg': '上传成功'} return self.json()
def download(self): """下载文件 """ params = self.req_params() filepath = fileutil.join_path(self.filedir, params.path) filename = filepath.split('/')[-1] f = None try: f = open(filepath, "rb") web.header('Content-Type','application/octet-stream') web.header('Content-disposition', 'attachment; filename=%s' % filename) while True: c = f.read(BUF_SIZE) if c: yield c else: break except Exception, e: print e yield 'Error', e.message
def download(self): """下载文件 http://simple-is-better.com/news/632 http://outofmemory.cn/code-snippet/1308/webpy-xiazai-file """ params = self.req_params() path = params.path filepath = fileutil.join_path(self.filedir, path) filename = filepath.split('/')[-1] f = None try: f = open(filepath, "rb") web.header('Content-Type','application/octet-stream') web.header('Content-disposition', 'attachment; filename=%s' % filename) while True: c = f.read(BUF_SIZE) if c: yield c else: break except Exception, e: print e yield 'Error', e.message
filepath = fileutil.join_path(self.filedir, path) try: files = os.listdir(filepath) except OSError, e: self.resp = {'errno': errno_client, 'msg': '路径不存在'} return self.json() self.resp = {} self.resp['errno'] = errno_ok self.resp['label'] = '所有文件' self.resp['path'] = path self.resp['list'] = [] for filename in files: file_info = {} file_info['server_filename'] = filename fpath = fileutil.join_path(filepath, filename) file_info['size'] = fileutil.friend_size(os.path.getsize(fpath)) file_info['path'] = fileutil.join_path(path, filename) file_info['isdir'] = 1 if os.path.isdir(fpath) else 0 file_info['server_ctime'] = timeutil.time_sec_to_str(os.path.getctime(fpath), timeutil.common_date) file_info['server_mtime'] = timeutil.time_sec_to_str(os.path.getmtime(fpath), timeutil.common_date) if file_info['isdir']: file_info['dir_empty'] = 0 if os.listdir(fpath) else 1 file_info['fs_id'] = 0 file_info['category'] = 0 self.resp['list'].append(file_info) return self.json() def remove(self): """删除文件(非目录)