Example #1
0
    def upload_file(self, path: str, data: InMemoryUploadedFile, unzip=True):
        """Upload file at the given `path`

        Args:
            path (`str`): A path relative to the directory.
            data: File to write.

        Raises:
            `TypeError`: If `path` is null or empty.
            `FileNotFoundError`: If `path` does not points to an existing file.
            `FileExistsError`: If `path` points to an existing file.
            `PermissionError`: If `path` points to a file outside of the current directory.
        """

        path = '.' if not path else path
        abspath = self._validate(path, authorize_root=True)

        if not abspath.is_dir():
            raise NotADirectoryError(
                f"NotADirectoryError: [Errno 20] No such directory: '{path}'")

        abspath, _ = uniquify_filename(abspath, data.name)
        abspath = Path(abspath)

        with abspath.open('wb+') as destfile:
            for chunk in data.chunks():
                destfile.write(chunk)

        if unzip and data.content_type == 'application/zip':
            shutil.unpack_archive(abspath, abspath.parent)
            abspath.unlink()  # delete the zip

        self.commit(f'upload {data.name} into {path}')
Example #2
0
    def save(self, commit=True):
        img = scale_and_crop(self.files['image'], **MARKDOWNX_IMAGE_MAX_SIZE)
        thumb_io = BytesIO()
        img.save(thumb_io,
                 self.files['image'].content_type.split('/')[-1].upper())

        file_name = str(self.files['image'])
        thumb_io.seek(0, os.SEEK_END)
        img = InMemoryUploadedFile(thumb_io, "image", file_name,
                                   self.files['image'].content_type,
                                   thumb_io.tell(), None)

        unique_file_name = self.get_unique_file_name(file_name)
        full_path = os.path.join(settings.MEDIA_ROOT, MARKDOWNX_MEDIA_PATH,
                                 unique_file_name)
        if not os.path.exists(os.path.dirname(full_path)):
            os.makedirs(os.path.dirname(full_path))

        destination = open(full_path, 'wb+')
        for chunk in img.chunks():
            destination.write(chunk)
        destination.close()

        return os.path.join(settings.MEDIA_URL, MARKDOWNX_MEDIA_PATH,
                            unique_file_name)
Example #3
0
def write_upload_img(path, file: InMemoryUploadedFile):
    """
    将文件存储到磁盘
    :param path:  文件的存储路径、相对于 media
    :param file:  文件对象
    :return: 返回文件相对路径
    """
    # 获取文件的名称
    file_name = file.name

    # 获取文件的名 和 后缀
    index = file_name.rfind(".")
    _n = file_name if index == -1 else file_name[:index]
    _e = "" if index == -1 else file_name[index:]

    # 随机产生文件的后缀、防止重复
    _random_text = "".join(random.choices(string.ascii_letters, k=6))

    # 获取文件名
    file_name = _n + _random_text if index == -1 else _n + _random_text + _e

    # 判断跟目录是否存在
    if not os.path.exists(os.path.join(settings.MEDIA_ROOT, path)):
        os.makedirs(os.path.join(settings.MEDIA_ROOT, path))

    # 进行存储
    with open(os.path.join(settings.MEDIA_ROOT, path, file_name), "wb") as f:

        for chunk in file.chunks():
            f.write(chunk)

    return os.path.join(path, file_name)
Example #4
0
def write_uploaded_file(in_memory_file: InMemoryUploadedFile) -> str:
    """
    :param in_memory_file: An WSGI in memory file
    :param write_path: The path which the file should be written to on disk
    :return: A str of path to file on disk.
    """
    try:
        stage_dir = settings.EXPORT_STAGING_ROOT.rstrip("\/")
        uid = str(uuid4())
        dir_name = os.path.join(stage_dir, uid)

        os.mkdir(dir_name)
        file_name = in_memory_file.name

        file_name, file_extension = os.path.splitext(file_name)
        if not file_name or not file_extension:
            raise Exception("No file type detected")

        # Remove all non-word characters
        file_name = re.sub(r"[^\w\s]", "", file_name)
        # Replace all whitespace with a single underscore
        file_name = re.sub(r"\s+", "_", file_name).lower()
        file_name = f"{file_name}-{uid}"

        out_path = os.path.join(dir_name,
                                "in_{0}{1}".format(file_name, file_extension))
        with open(out_path, "wb+") as temp_file:
            for chunk in in_memory_file.chunks():
                temp_file.write(chunk)
        return out_path
    except Exception as e:
        logger.debug(e, exc_info=True)
        raise Exception("Could not write file to disk")
Example #5
0
def _store_local(filelike: InMemoryUploadedFile) -> Tuple[str, str]:
    name = filelike.name + str(time())
    m = md5()
    m.update(name.encode('utf-8'))
    ret_name: str = m.hexdigest()
    tmpdir = 'tmp/'
    path = tmpdir + ret_name
    if not os.path.exists(tmpdir):
        os.makedirs(tmpdir)
    with default_storage.open(path, 'wb+') as destination:
        for chunk in filelike.chunks():
            destination.write(chunk)
    return filelike.name, os.path.join(settings.MEDIA_ROOT, path)
Example #6
0
 def test_post_upload_succeed(self, uuid_uuid1):
     found = resolve('/image/upload/', urlconf=adminpage.urls)
     request = Mock(wraps=HttpRequest(), method='POST')
     file = MultiValueDict()
     file['image'] = InMemoryUploadedFile(None, None, "1", 'image/jpg', None, 'utf-8')
     file['image'].chunks = Mock(return_value=[b"1"])
     request.FILES = file
     request.body = Mock()
     request.body.decode = Mock(return_value='{}')
     request.user = Mock()
     request.user.is_authenticated = Mock(return_value=True)
     uuid.uuid1.return_value = 1
     response = json.loads(found.func(request).content.decode())
     self.assertEqual(response['code'], 0)
Example #7
0
def name_save_file(file: InMemoryUploadedFile) -> str:
    """
    Saves a file using a random name and returns the name
    """
    file_extension = file.name.split('.')[-1]
    target_file_name = '.' + file_extension
    target_file_name = random_string(20 -
                                     len(target_file_name)) + target_file_name
    with open(os.path.join(IMAGES_DIR, target_file_name),
              'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)

    return target_file_name
Example #8
0
def save_image(uploaded_file: InMemoryUploadedFile, user) -> Image:
    """process requested file

    Parameters
    ----------
    uploaded_file : InMemoryUploadedFile
        file uploaded by the user
    user : object
        the user who uploaded the image

    Returns
    -------
    Image object
        the new image object that has been created
    """
    # get valid file type
    valid_file_types = ImageConfig.objects.load().valid_image_formats
    valid_file_types_str = ','.join(valid_file_types)
    logger.debug(f'valid file types: {valid_file_types_str}')

    # get file name
    file_name = uploaded_file.name

    # check file extension
    _, file_extension = os.path.splitext(file_name)
    if not file_extension in valid_file_types:
        raise TypeError  #django error

    # create unique path to save file to
    uuid_name = f'{uuid.uuid4()}{file_extension}'
    save_path = os.path.join(SAVED_IMAGES, uuid_name)
    logger.info(f'Saving image at {save_path}')
    upload_path = '/' + os.path.relpath(save_path, UPLOADED_STATIC_FILES)
    logger.info(f'Image can be found at /static{upload_path}')

    # write file to path
    with open(save_path, 'wb+') as destination:
        for chunk in uploaded_file.chunks():
            destination.write(chunk)

    # save image object
    return Image.objects.create(
        name=file_name,
        file_path=save_path,
        upload_path=upload_path,
        owner=user,
    )
Example #9
0
    def test_can_create_pil_image_from_uploaded_image(self):
        with open(os.path.join(settings.BASE_DIR, 'xray.jpg'), 'rb') as fp:
            img_a = Image.open(fp)

            fp.seek(0)
            up_file = InMemoryUploadedFile(
                fp, 'image', 'xray.jpg', 'image/jpg',
                os.path.getsize(os.path.join(settings.BASE_DIR, 'xray.jpg')),
                'latin1')
            b = io.BytesIO()
            for chunk in up_file.chunks():
                b.write(bytes(chunk))

            b.seek(0)
            img_b = Image.open(b)

            self.assertEqual(img_a, img_b)
Example #10
0
    def save(self, commit=True):
        img = scale_and_crop(self.files['image'], **MARKDOWNX_IMAGE_MAX_SIZE)
        thumb_io = BytesIO()
        img.save(thumb_io,  self.files['image'].content_type.split('/')[-1].upper())

        file_name = str(self.files['image'])
        thumb_io.seek(0, os.SEEK_END)
        img = InMemoryUploadedFile(thumb_io, "image", file_name, self.files['image'].content_type, thumb_io.tell(), None)

        unique_file_name = self.get_unique_file_name(file_name)
        full_path = os.path.join(settings.MEDIA_ROOT, MARKDOWNX_MEDIA_PATH, unique_file_name)
        if not os.path.exists(os.path.dirname(full_path)):
            os.makedirs(os.path.dirname(full_path))

        destination = open(full_path, 'wb+')
        for chunk in img.chunks():
            destination.write(chunk)
        destination.close()

        return os.path.join(settings.MEDIA_URL, MARKDOWNX_MEDIA_PATH, unique_file_name)
Example #11
0
    def save_file(self, file: InMemoryUploadedFile, filename=None) -> str:
        """
        Save fule.
        :param file: file from the request.
        :return: path to saved file.
        """
        os.makedirs(os.path.dirname(settings.UPLOADED_FILE_DIR), exist_ok=True)

        if not filename:
            while True:
                filename = settings.UPLOADED_FILE_DIR + ''.join(
                    random.choices(string.ascii_lowercase, k=42))
                if not os.path.isfile(filename):
                    break
            name_puts = file.name.split('.')
            if len(name_puts) > 1:
                filename = f'{filename}.{name_puts[-1]}'
        with open(filename, 'wb+') as destination:
            for chunk in file.chunks():
                destination.write(chunk)
        return filename
Example #12
0
def save_to_temp(unique_dir: UUID, file: InMemoryUploadedFile) -> str:
    """ Save the file to temporary storage
    Parameters
    ----------
    unique_dir: UUID
        unique directory that this operation is scoped to
    file : django.core.files.uploadedfile.InMemoryUploadedFile
        File uploaded by the user

    Returns
    -------
    file_path : str
        file path of the saved file
    """
    file_directory = f'files/temp/{unique_dir}'
    file_path = f'{file_directory}/{file.name}'
    if not os.path.exists(file_directory):
        os.makedirs(file_directory)
    with open(file_path, 'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)
    return file_path
def save_logo(logo: InMemoryUploadedFile):
    file_path = os.path.abspath(f'static/media/logos/{logo.name}')
    with open(file_path, 'wb+') as destination:
        for chunk in logo.chunks():
            destination.write(chunk)
Example #14
0
def upload_and_search_face(request):
    """
    upload and search face
    :param request:
    :return:
    """
    image_dir = 'cv/static/FaceUpload'
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)

    tik = time.time()
    result = {}

    if request.method == "POST":
        image = request.FILES.get("image", None)
        if not image:
            result['code'] = 1
            result['msg'] = 'invalid image'
            result['results'] = None

            json_result = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_result)

        if not isinstance(image, InMemoryUploadedFile):
            imgstr = request.POST.get("image", None)
            if 'http' in imgstr:
                response = requests.get(imgstr)
                image = InMemoryUploadedFile(io.BytesIO(response.content),
                                             name="{}.jpg".format(
                                                 str(time.time())),
                                             field_name="image",
                                             content_type="image/jpeg",
                                             size=1347415,
                                             charset=None)
            else:
                image = InMemoryUploadedFile(
                    io.BytesIO(base64.b64decode(imgstr)),
                    name="{}.jpg".format(str(time.time())),
                    field_name="image",
                    content_type="image/jpeg",
                    size=1347415,
                    charset=None)
        else:
            destination = open(os.path.join(image_dir, image.name), 'wb+')
            for chunk in image.chunks():
                destination.write(chunk)
            destination.close()

        result['code'] = 0
        result['msg'] = 'Success'
        result['results'] = face_searcher.search(
            os.path.join(image_dir, image.name))['results']
        result['elapse'] = round(time.time() - tik, 2)

        json_str = json.dumps(result, ensure_ascii=False, cls=NumpyEncoder)

        return HttpResponse(json_str)
    else:
        result['code'] = 3
        result['msg'] = 'Invalid HTTP Method'
        result['data'] = None

        json_result = json.dumps(result, ensure_ascii=False)

        return HttpResponse(json_result)
Example #15
0
def save_in_memory_file(f: InMemoryUploadedFile, path: str):
    folder_path = os.path.dirname(os.path.abspath(path))
    os.makedirs(folder_path, exist_ok=True)
    with open(path, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)
Example #16
0
        print(type(pic))
        # 创建一个文件
        # save_path = "%s/booktest/%s" % (settings.MEDIA_ROOT, pic.name)
        save_path = "E:/不常用工作/已解密文件/%s" % pic.name
        with open(save_path, "wb") as f:
            # 获取上传文件的内容并写入打开的文件
            for content in pic.chunks():
                f.write(content)
        # 复制一份文件放入桌面
        save_path_desktop = "C:/Users/931304/Desktop/已解密文件/%s" % pic.name
        with open(save_path_desktop, "wb") as f:
            for content in pic.chunks():
                f.write(content)
        # 返回
        return redirect("/decrypt")


pic_io = BytesIO(b"C:/Users/931304/Desktop")
pic = InMemoryUploadedFile(file=pic_io,
                           field_name="pic",
                           name="wenjian.xlsx",
                           content_type=None,
                           size=11854,
                           charset=None)

save_path = "E:/不常用工作/已解密文件/wenjian.xlsx"
with open(save_path, "wb") as f:
    # 获取上传文件的内容并写入打开的文件
    for content in pic.chunks():
        f.write(content)
Example #17
0
def upload_file(file: InMemoryUploadedFile):
    with open('users/{}'.format(file.name), 'wb') as f:
        for i in file.chunks():
            f.write(i)
Example #18
0
 def upload_in_memory_uploaded_file(self, uploaded_file: InMemoryUploadedFile, directory: str, filename: str) -> None:
     self.__create_directory(directory)
     with open(f'{self.__base_dir}/{directory}/{filename}', 'wb+') as file:
         for chunk in uploaded_file.chunks():
             file.write(chunk)
Example #19
0
def upload_and_deblur(request):
    """
    upload and do Image Deblurring
    :param request:
    :return:
    """
    tik = time.time()
    from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile
    import io

    image_dir = 'cv/static/SRImgs'
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)

    result = {}

    if request.method == "POST":
        image = request.FILES.get("image", None)
        if not isinstance(image, InMemoryUploadedFile) and not isinstance(
                image, TemporaryUploadedFile):
            imgstr = request.POST.get("image", None)
            if imgstr is None:
                result['code'] = 3
                result['msg'] = 'Do not upload image larger than 2.5MB'
                result['elapse'] = time.time() - tik
                result['data'] = None

                json_result = json.dumps(result, ensure_ascii=False)

                return HttpResponse(json_result)
            else:
                if 'http://' in imgstr or 'https://' in imgstr:
                    response = requests.get(imgstr)
                    image = InMemoryUploadedFile(io.BytesIO(response.content),
                                                 name="{}.jpg".format(
                                                     str(time.time())),
                                                 size=100,
                                                 field_name="image",
                                                 content_type="image/jpeg",
                                                 charset=None)
                else:
                    image = InMemoryUploadedFile(
                        io.BytesIO(base64.b64decode(imgstr)),
                        name="{}.jpg".format(str(time.time())),
                        size=100,
                        field_name="image",
                        content_type="image/jpeg",
                        charset=None)
        if not image:
            result['code'] = 2
            result['msg'] = 'Invalid Image Path'
            result['elapse'] = time.time() - tik
            result['data'] = None

            json_result = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_result)
        else:
            destination = open(os.path.join(image_dir, image.name), 'wb+')
            for chunk in image.chunks():
                destination.write(chunk)
            destination.close()

            result['code'] = 0
            result['msg'] = 'success'
            result['elapse'] = time.time() - tik

            sr_img_path = deblur(deblur_gan_v2,
                                 os.path.join(image_dir, image.name))
            result['sr_img'] = sr_img_path

            json_str = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_str)
    else:
        result['code'] = 1
        result['msg'] = 'Invalid HTTP Method'
        result['elapse'] = time.time() - tik
        result['data'] = None

        json_result = json.dumps(result, ensure_ascii=False)

        return HttpResponse(json_result)
Example #20
0
def upload_and_rec_beauty(request):
    """
    upload and recognize image
    :param request:
    :return:
    """
    image_dir = 'cv/static/FaceUpload'
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)

    result = {}

    if request.method == "POST":
        image = request.FILES.get("image", None)
        if not isinstance(image, InMemoryUploadedFile):
            imgstr = request.POST.get("image", None)
            if 'http' in imgstr:
                response = requests.get(imgstr)
                image = InMemoryUploadedFile(io.BytesIO(response.content),
                                             name="{}.jpg".format(
                                                 str(time.time())),
                                             field_name="image",
                                             content_type="image/jpeg",
                                             size=1347415,
                                             charset=None)
            else:
                image = InMemoryUploadedFile(
                    io.BytesIO(base64.b64decode(imgstr)),
                    name="{}.jpg".format(str(time.time())),
                    field_name="image",
                    content_type="image/jpeg",
                    size=1347415,
                    charset=None)

        if not image:
            result['code'] = 1
            result['msg'] = 'Invalid Path for Face Image'
            result['data'] = None

            json_result = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_result)
        else:
            destination = open(os.path.join(image_dir, image.name), 'wb+')
            for chunk in image.chunks():
                destination.write(chunk)
            destination.close()

            tik = time.time()
            imagepath = URL_PORT + '/static/FaceUpload/' + image.name

            res = beauty_recognizer.infer(os.path.join(image_dir, image.name))

            if res is not None:
                result['code'] = 0
                result['msg'] = 'success'
                result['data'] = {
                    'imgpath': imagepath,
                    'beauty': round(res['beauty'], 2),
                    'detection': res['mtcnn']
                }
                result['elapse'] = round(time.time() - tik, 2)
            else:
                result['code'] = 3
                result['msg'] = 'None face is detected'
                result['data'] = None
                result['elapse'] = round(time.time() - tik, 2)

            json_str = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_str)
    else:
        result['code'] = 2
        result['msg'] = 'Invalid HTTP Method'
        result['data'] = None

        json_result = json.dumps(result, ensure_ascii=False)

        return HttpResponse(json_result)
Example #21
0
def upload_and_rec_skin_disease(request):
    """
    upload and recognize skin disease
    :param request:
    :return:
    """
    image_dir = 'cv/static/SkinUpload'
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)

    result = {}

    if request.method == "POST":
        image = request.FILES.get("image", None)
        if not isinstance(image, InMemoryUploadedFile):
            imgstr = request.POST.get("image", None)
            if 'http' in imgstr:
                response = requests.get(imgstr)
                image = InMemoryUploadedFile(io.BytesIO(response.content),
                                             name="{}.jpg".format(
                                                 str(time.time())),
                                             field_name="image",
                                             content_type="image/jpeg",
                                             size=1347415,
                                             charset=None)
            else:
                image = InMemoryUploadedFile(
                    io.BytesIO(base64.b64decode(imgstr)),
                    name="{}.jpg".format(str(time.time())),
                    field_name="image",
                    content_type="image/jpeg",
                    size=1347415,
                    charset=None)

        if not image:
            result['code'] = 3
            result['msg'] = 'Invalid Path for Skin Image'
            result['results'] = None

            json_result = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_result)
        else:
            destination = open(os.path.join(image_dir, image.name), 'wb+')
            for chunk in image.chunks():
                destination.write(chunk)
            destination.close()

            tik = time.time()
            imagepath = URL_PORT + '/static/SkinUpload/' + image.name

            skin_disease = skin_disease_recognizer.infer_from_img_file(
                os.path.join(image_dir, image.name))
            # skin_disease = skin_disease_recognizer.infer_from_img(destination)

            result['code'] = 0
            result['msg'] = 'success'
            result['imgpath'] = imagepath
            if max(_['probability']
                   for _ in skin_disease['results']) > PROB_THRESH:
                result['results'] = skin_disease['results']
            else:
                result['results'] = [{
                    'disease':
                    'Unknown',
                    'probability':
                    skin_disease['results'][0]['probability']
                }]
            result['elapse'] = round(time.time() - tik, 2)

            json_str = json.dumps(result, ensure_ascii=False)

            return HttpResponse(json_str)
    else:
        result['code'] = 3
        result['msg'] = 'Invalid HTTP Method'
        result['data'] = None
        result['elapse'] = 0

        json_result = json.dumps(result, ensure_ascii=False)

        return HttpResponse(json_result)