X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_common%2Ffsmongo.py;fp=osm_common%2Ffsmongo.py;h=b04057e4d6993586ea3edf2f2dc7cce73ff2bd66;hb=fc5a6f81fe314d76d5af7fda83c2890e12faf615;hp=51dc11f6edb58992d819262e2433e339b43c12f0;hpb=65d6c32f5c0235fdb15d184c3f7ae9166780c641;p=osm%2Fcommon.git diff --git a/osm_common/fsmongo.py b/osm_common/fsmongo.py index 51dc11f..b04057e 100644 --- a/osm_common/fsmongo.py +++ b/osm_common/fsmongo.py @@ -22,6 +22,8 @@ from io import BytesIO, StringIO import logging import os import datetime +import tarfile +import zipfile from gridfs import GridFSBucket, errors from osm_common.fsbase import FsBase, FsException @@ -342,6 +344,8 @@ class FsMongo(FsBase): "Multiple files found", http_code=HTTPStatus.INTERNAL_SERVER_ERROR ) + print(requested_file.metadata) + # if no special mode is required just check it does exists if not mode: return True @@ -374,35 +378,60 @@ class FsMongo(FsBase): return requested_file.length - def file_extract(self, tar_object, path): + def file_extract(self, compressed_object, path): """ extract a tar file - :param tar_object: object of type tar + :param compressed_object: object of type tar or zip :param path: can be a str or a str list, or a tar object where to extract the tar_object :return: None """ f = path if isinstance(path, str) else "/".join(path) - for member in tar_object.getmembers(): - if member.isfile(): - stream = tar_object.extractfile(member) - elif member.issym(): - stream = BytesIO(member.linkname.encode("utf-8")) - else: - stream = BytesIO() + if type(compressed_object) is tarfile.TarFile: + for member in compressed_object.getmembers(): + if member.isfile(): + stream = compressed_object.extractfile(member) + elif member.issym(): + stream = BytesIO(member.linkname.encode("utf-8")) + else: + stream = BytesIO() - if member.isfile(): - file_type = "file" - elif member.issym(): - file_type = "sym" - else: - file_type = "dir" + if member.isfile(): + file_type = "file" + elif member.issym(): + file_type = "sym" + else: + file_type = "dir" - metadata = {"type": file_type, "permissions": member.mode} + metadata = {"type": file_type, "permissions": member.mode} - self.fs.upload_from_stream(f + "/" + member.name, stream, metadata=metadata) + self.fs.upload_from_stream( + f + "/" + member.name, stream, metadata=metadata + ) - stream.close() + stream.close() + elif type(compressed_object) is zipfile.ZipFile: + for member in compressed_object.infolist(): + if member.is_dir(): + stream = BytesIO() + else: + stream = compressed_object.read(member) + + if member.is_dir(): + file_type = "dir" + else: + file_type = "file" + + metadata = {"type": file_type} + + print("Now uploading...") + print(f + "/" + member.filename) + self.fs.upload_from_stream( + f + "/" + member.filename, stream, metadata=metadata + ) + + if member.is_dir(): + stream.close() def file_open(self, storage, mode): """ @@ -453,6 +482,9 @@ class FsMongo(FsBase): http_code=HTTPStatus.NOT_FOUND, ) + if f.endswith("/"): + f = f[:-1] + files_cursor = self.fs.find( {"filename": {"$regex": "^{}/([^/])*".format(f)}} )