python - 我可以直接使用 InMemoryUploadedFile 将图像上传到 Imgur 吗?
问题描述
我在使用 Django 将图像上传到 Imgur 时遇到了一些问题。
我已经完成了从 react 上传的图像文件,并通过 Axios 将文件数据传递到后端。
但是我从 Python 后端的 request.data 中得到的对象是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'>
。
但是imgurpython包函数中的第一个参数ImgurClient.upload_from_path
需要上传文件名。
所以当我执行这段代码时,我会得到这个错误:
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"
推荐阅读
- html - html+css布局问题(定位项)
- jquery - 执行多个 XHR 请求,无需相互等待
- sas - 将 ods 的 sas 输出导出到乳胶的问题(背面
- ember.js - 错误:您试图覆盖内置帮助程序“数组”。这是从哪里来的?
- c++ - 为什么两者都有 std::move
和 - uitableview - 部分标题视图中的 UIPanGestureRecognizer 影响 UITableViewCell
- python - 使用cdf函数计算(≤2)=(0)+(1)+(2)
- sql-server - SSIS - 目标excel不显示所有单元格,而只显示F1,F2等
- json - 使用 Fetch 有时会出现类型错误,因为照片的 href 未定义
- c++ - C ++中矩形的碰撞解决方案