def Move(self, path): from diskcloud.libs.file import moveto bf_result = valid_url_path(path) if isinstance(bf_result, dict): af_path = request.json.get("af_path") af_result = valid_url_path(af_path, True) if isinstance(af_result, dict): if af_result['is_file'] is False: return moveto(bf_result['username'], bf_result['path'], bf_result['name'], af_result['path'], af_result['name'], bf_result['is_file']) return gen_error_res("目标路径必须是文件夹", 400) return af_result return bf_result
def Unstar(self, path): from diskcloud.libs.file import unstar result = valid_url_path(path) if isinstance(result, dict): return unstar(result['username'], result['path'], result['name']) return result
def download(path): from flask import current_app, make_response from pathlib import Path from tarfile import open from urllib.parse import quote from diskcloud.libs.response import gen_error_res from diskcloud.libs.valid import valid_url_path result = valid_url_path(path) if isinstance(result, dict): if result['is_file'] is True: complete_path = Path(current_app.config['FILES_FOLDER'], 'user', path) complete_path_str = complete_path.resolve().as_posix() if current_app.config['TESTING'] == False: content_length = get_size(complete_path) content_mime = get_mime(complete_path) if result['is_file'] is False: complete_path = Path(current_app.config['FILES_FOLDER'], 'tar', path + '.tar') complete_path_str = complete_path.resolve().as_posix() Path(complete_path.parent).mkdir(parents=True, exist_ok=True) try: with open(complete_path_str, 'x') as tar: tar.add(Path(current_app.config['FILES_FOLDER'], 'user', path).as_posix(), arcname=complete_path.stem) except FileExistsError: from os import remove remove(complete_path_str) with open(complete_path_str, 'x') as tar: tar.add(Path(current_app.config['FILES_FOLDER'], 'user', path).as_posix(), arcname=complete_path.stem) if current_app.config['TESTING'] == False: content_length = get_size(complete_path) content_mime = "application/x-tar" filename = complete_path_str.rsplit('/', maxsplit=1)[1] if current_app.config['TESTING'] == True: from flask import send_from_directory dirname = complete_path_str.rsplit('/', maxsplit=1)[0] return send_from_directory(dirname, filename, as_attachment=True) response = make_response('') filename_escape = quote(filename) response.headers['X-Accel-Redirect'] = current_app.config[ 'NGINX_X_ACCEL_REDIRECT'] + '/' + complete_path.relative_to( current_app.config['FILES_FOLDER']).as_posix() response.headers[ 'Content-Disposition'] = "attachment;filename=" + filename_escape + ";filename*=UTF-8''" + filename_escape response.headers['Content-Length'] = content_length response.headers['Content-Type'] = content_mime return response else: return result
def Delete(self, path): from diskcloud.libs.file import delete result = valid_url_path(path, False, True) if isinstance(result, dict): return delete(result['username'], result['path'], result['name'], result['is_file']) return result
def Untrashcan(self, path): from diskcloud.libs.file import untrash_can result = valid_url_path(path, False, True) if isinstance(result, dict): return untrash_can(result['username'], result['path'], result['name'], result['is_file']) return result
def EmptyTrashcan(self, path): from diskcloud.libs.file import empty_trash_can result = valid_url_path(path, True) if isinstance(result, dict): if result['path'] == '.' and result['name'] == '.': return empty_trash_can(result['username']) else: return gen_error_res('无效的URL', 400) return result
def ShareId(self, path): from diskcloud.libs.share import get_sid from diskcloud.libs.response import gen_json_res result = valid_url_path(path) if isinstance(result, dict): result = get_sid(result['username'], result['path'], result['name']) if isinstance(result, dict): return gen_json_res(result) return result
def StarInfo(self, path): from diskcloud.libs.file import get_star_info from diskcloud.libs.response import gen_json_res result = valid_url_path(path, True) if isinstance(result, dict): if result['path'] == '.' and result['name'] == '.': json_obj = get_star_info(result['username']) return gen_json_res(json_obj) else: return gen_error_res('无效的URL', 400) return result
def Info(self, path): from diskcloud.libs.file import get_folder_content from diskcloud.libs.response import gen_json_res result = valid_url_path(path, True) if isinstance(result, dict): if result['is_file']: pass else: json_obj = get_folder_content(result['username'], result['path'], result['name']) return gen_json_res(json_obj) return result
def SearchInfo(self, path): from diskcloud.libs.file import get_search_info from diskcloud.libs.response import gen_json_res search_text = request.args.get('search_text', None) if search_text is None: return gen_error_res("无效的请求参数", 400) result = valid_url_path(path, True) if isinstance(result, dict): if result['path'] == '.' and result['name'] == '.': json_obj = get_search_info(result['username'], search_text) return gen_json_res(json_obj) else: return gen_error_res('无效的URL', 400) return result
def CreateFolder(self, path): from diskcloud.libs.file import create_folder from diskcloud.libs.valid import valid_dir_name name = request.args.get('name', None) if name is None: return gen_error_res("无效的请求参数", 400) result = valid_url_path(path, True) if isinstance(result, dict): if result['is_file'] is False: if valid_dir_name(name): return create_folder(result['username'], result['path'], result['name'], name) return gen_error_res("无效的文件夹名称", 400) return gen_error_res("路径必须是文件夹", 400) return result
def Rename(self, path): from diskcloud.libs.file import rename from diskcloud.libs.valid import valid_file_name, valid_dir_name from diskcloud.libs.response import gen_error_res result = valid_url_path(path) if isinstance(result, dict): af_name = request.json.get('af_name') if result['is_file']: if not valid_file_name(af_name): return gen_error_res('无效的文件名称', 400) else: if not valid_dir_name(af_name): return gen_error_res('无效的文件夹名称', 400) return rename(result['username'], result['path'], result['name'], af_name, result['is_file']) return result
def UploadFiles(self, path): from diskcloud.libs.file import save_file from diskcloud.libs.valid import valid_file_name result = valid_url_path(path, True) if isinstance(result, dict): if result['is_file'] is False: files = request.files if len(files) == 0: return gen_error_res("没有选中的文件") for i in files: if valid_file_name(files[i].filename): save_result = save_file(result['username'], result['path'], result['name'], files[i]) if save_result is not True: return save_result else: return gen_error_res('无效的文件名称', 400) return ('', 200) return gen_error_res("路径必须是文件夹", 400) return result
def Share(self, path): from diskcloud.libs.share import generate_id from diskcloud.libs.response import gen_json_res result = valid_url_path(path) if isinstance(result, dict): # check id_life id_life = request.args.get('life') if id_life is None: return gen_error_res('无效的时间参数', 400) try: id_life = int(id_life) except ValueError: return gen_error_res('无效的时间参数', 400) if not 0 <= id_life <= 24: return gen_error_res('无效的时间参数', 400) # generate share id result = generate_id(result['username'], result['path'], result['name'], id_life) if result['succeed']: return gen_json_res({'sid': result['sid']}) return gen_error_res(result['reason'], 500) return result