예제 #1
0
파일: controller.py 프로젝트: Tyler-D/Zfile
    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()
예제 #2
0
파일: controller.py 프로젝트: Tyler-D/Zfile
 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()
예제 #3
0
파일: controller.py 프로젝트: Tyler-D/Zfile
    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()
예제 #4
0
파일: controller.py 프로젝트: Tyler-D/Zfile
    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()
예제 #5
0
파일: controller.py 프로젝트: Tyler-D/Zfile
    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()
예제 #6
0
파일: controller.py 프로젝트: Tyler-D/Zfile
    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()
예제 #7
0
파일: controller.py 프로젝트: Tyler-D/Zfile
 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
예제 #8
0
파일: controller.py 프로젝트: Tyler-D/Zfile
 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
예제 #9
0
파일: controller.py 프로젝트: Tyler-D/Zfile
        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):
        """删除文件(非目录)