Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
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
Exemple #4
0
    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
Exemple #5
0
    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
Exemple #6
0
    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
Exemple #7
0
    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
Exemple #8
0
    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
Exemple #9
0
    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
Exemple #10
0
    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
Exemple #11
0
    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
Exemple #12
0
    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
Exemple #13
0
    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
Exemple #14
0
    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