2019-07-10 17:34:45 +08:00
|
|
|
# fileUpload.py
|
|
|
|
|
|
|
|
import os
|
|
|
|
import time
|
|
|
|
import tempfile
|
2023-02-22 22:16:41 +08:00
|
|
|
import aiofiles
|
2019-07-10 17:34:45 +08:00
|
|
|
|
|
|
|
from appPublic.folderUtils import _mkdir
|
|
|
|
from appPublic.jsonConfig import getConfig
|
|
|
|
|
|
|
|
class FileStorage:
|
|
|
|
def __init__(self):
|
|
|
|
config = getConfig()
|
|
|
|
self.root = config.filesroot or tempfile.gettempdir()
|
|
|
|
|
|
|
|
def realPath(self,path):
|
|
|
|
if path[0] == '/':
|
|
|
|
path = path[1:]
|
|
|
|
p = os.path.join(self.root,path)
|
|
|
|
return p
|
|
|
|
|
2019-08-28 10:15:35 +08:00
|
|
|
def _name2path(self,name):
|
2019-07-10 17:34:45 +08:00
|
|
|
name = os.path.basename(name)
|
|
|
|
paths=[191,193,197,199,97]
|
|
|
|
v = int(time.time()*1000000)
|
|
|
|
# b = name.encode('utf8') if not isinstance(name,bytes) else name
|
|
|
|
# v = int.from_bytes(b,byteorder='big',signed=False)
|
|
|
|
path = os.path.abspath(os.path.join(self.root,
|
2019-08-28 10:15:35 +08:00
|
|
|
str(v % paths[0]),
|
|
|
|
str(v % paths[1]),
|
|
|
|
str(v % paths[2]),
|
|
|
|
str(v % paths[3]),
|
|
|
|
str(v % paths[4]),
|
2019-07-10 17:34:45 +08:00
|
|
|
name))
|
|
|
|
return path
|
|
|
|
|
2019-08-28 10:15:35 +08:00
|
|
|
async def save(self,name,read_data):
|
2023-02-22 22:16:41 +08:00
|
|
|
# print(f'FileStorage():save():{name=}')
|
2019-08-28 10:15:35 +08:00
|
|
|
p = self._name2path(name)
|
2023-02-22 22:16:41 +08:00
|
|
|
fpath = p[len(self.root):]
|
2019-07-10 17:34:45 +08:00
|
|
|
_mkdir(os.path.dirname(p))
|
2023-02-22 22:16:41 +08:00
|
|
|
async with aiofiles.open(p,'wb') as f:
|
|
|
|
siz = 0
|
2019-07-10 17:34:45 +08:00
|
|
|
while 1:
|
|
|
|
d = await read_data()
|
|
|
|
if not d:
|
|
|
|
break
|
2023-02-22 22:16:41 +08:00
|
|
|
siz += len(d);
|
2019-07-10 17:34:45 +08:00
|
|
|
await f.write(d)
|
2023-02-22 22:16:41 +08:00
|
|
|
await f.flush()
|
|
|
|
print(f'{name=} file({fpath}) write {siz} bytes')
|
2019-07-10 17:34:45 +08:00
|
|
|
|
2023-02-22 22:16:41 +08:00
|
|
|
return fpath
|