Могу ли я использовать InMemoryUploadedFile непосредственно для загрузки изображения на Imgur?

У меня есть некоторые проблемы с загрузкой изображения на Imgur с помощью Django.

Я закончил загрузку файла изображения из react и передал данные файла в бэкенд через Axios.

Но объект, который я получил из request.data в бэкенде Python - InMemoryUploadedFile.

Я не хочу хранить на своем диске файлы изображений.

Могу ли я использовать непосредственно этот файл, который является типом InMemoryUploadedFile для загрузки функцией загрузки Imgur upload_from_path?

Если да, то как я могу сделать?

Вот мой код,

from django.shortcuts import render
from django.http import JsonResponse
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.response import Response

from django.contrib.auth.models import User
from base.models import InCome, IncomeMoneyCategory, IncomeContributeContext,OutcomeMoneyCategory, OutcomeContributeContext, Member, Student, OutCome

from django.db.models import F, Sum
from base.serializers import IncomeSerializer, OutcomeSerializer

from rest_framework import status

from datetime import datetime
import configparser
import base.config as env
import os
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from django.conf import settings
from imgurpython import  ImgurClient



@api_view(['POST'])
def upload_image(request):
    
    data = request.data
    
    print(data)
    album = env.IMGUR_ALBUM
    print(data['image'])
    image=data['image']
    print("--")
    print(type(image))
    
    image_path=image

    config = configparser.ConfigParser()
    path = '/'.join((os.path.abspath(__file__).replace('\\', '/')).split('/')[:-1])
    config.read(os.path.join(path, 'auth.ini'))
    #config.read('auth.ini')
    
    client_id = config['credentials']['client_id']
    client_secret = config['credentials']['client_secret']
    refresh_token = config['credentials']['refresh_token']
    access_token = config['credentials']['access_token']
    client = ImgurClient(client_id,client_secret, refresh_token)
    client.set_user_auth(access_token, refresh_token)   

    if client:
        config={
            'album':album,
            'name':'Ezra',
            'title':'Test',
            'description': 'Test {0}'.format(datetime.now())
        }

        print("Uploading image")
        
        image = client.upload_from_path(str(image_path),config=config,anon=False)
        
        print(image['link'])
        print("Done")
        return image

    else:return "Error"

Типом image является <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>.

Но первый параметр в функции ImgurClient.upload_from_path пакета imgurpython требует имя файла для загрузки.

Когда я выполню этот код, я получу эту ошибку: No such file or directory:...

Надеюсь, что кто-нибудь поможет мне решить эту проблему, и извините за мой плохой английский. Спасибо, что прочитали.

Я решил ее позже.

Я использовал default_storage для сохранения файла и указал каталог в качестве первого параметра в методе upload_from_path.

После загрузки на Imgur я удалил файлы и вернул ссылку обратно.

Вот мой код:

def upload_image(request):
    
    data = request.data
    
    album = env.IMGUR_ALBUM
    image=data['image']

    file = data['image']

    filename = default_storage.save(file.name, ContentFile(file.read()))
    

    config = configparser.ConfigParser()
    path = '/'.join((os.path.abspath(__file__).replace('\\', '/')).split('/')[:-1])
    config.read(os.path.join(path, 'auth.ini'))
   
    client_id = config['credentials']['client_id']
    client_secret = config['credentials']['client_secret']
    refresh_token = config['credentials']['refresh_token']
    access_token = config['credentials']['access_token']
    client = ImgurClient(client_id,client_secret, refresh_token)
    client.set_user_auth(access_token, refresh_token)   

    if client:
        config={
            'album':album,
            'name':'Ezra',
            'title':'Test',
            'description': 'Test {0}'.format(datetime.now())
        }

        print("Uploading image")
        
        image = client.upload_from_path(settings.MEDIA_ROOT+'/'+filename,config=config,anon=False)
        
        
        print("Done")
        default_storage.delete(filename)
        return Response(image['link'])

    else:return "Error"
Вернуться на верх