django 文件在本地打开但在服务器中失败
django file opens locally but fails in server
我想要实现的是让用户通过表单上传文件,比如个人资料图片,
我的目标是获取该文件,通过 imgbb 的 api 发送它并获取图像 url 以存储以供以后在我的模板中使用。
我能够通过下面的代码实现这一点,它在本地工作(Windows)但是一旦我推送到我的生产服务器(在这种情况下是 pythonanywhere),代码就会失败。
# CODE:
def testingpage(request):
image = ''
url = ''
if request.method == 'POST':
pic = request.FILES['image']
url = upload_to_bb(request, pic)
if url is not None:
from django.contrib import messages
messages.info(request, 'Uploaded Successfully')
return render(request, 'test.html', {'image': url})
def upload_to_bb(request, pic):
import os
from django.conf import settings
from django.core.files.storage import FileSystemStorage
import base64
import requests
base_url = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
fs = FileSystemStorage()
filename = fs.save(pic.name, pic)
file_path = f'{base_url}\media\{filename}'
apikey = settings.IMGBB_API_KEY
with open(file_path, "rb") as file:
url = "https://api.imgbb.com/1/upload"
payload = {
"key": apikey,
"image": base64.b64encode(file.read()),
}
r = requests.post(url, payload)
js = r.json()
if r.status_code == 200:
data = js['data']
file.close()
os.remove(file_path)
return data['image']['url']
else:
file.close()
os.remove(file_path)
from django.core.exceptions import ValidationError
raise ValidationError("An error occurred processing the image")
return None
罪魁祸首就是这行代码
file_path = f'{base_url}\media\{filename}'
在本地 windows 服务器上:
它returns
C:\Users\Sammy\PycharmProjects\kegites\media\WIN_20211209_15_41_37_Pro.jpg
在 pythonanywhere 上,我收到错误:
FileNotFoundError at /
[Errno 2] No such file or directory: '/home/kegitesclub/kegites\media\WIN_20211209_15_41_36_Pro_3afnrPi.jpg'
在 heroku 上,我得到:
No such file or directory: '/app\media\WIN_20211209_15_41_37_Pro.jpg'
是否与 linux 有关,这些服务器是或者是其他东西,也许是 Django 的限制?或者你能建议一个更好的方法来达到最终结果吗?
如有任何帮助,我们将不胜感激
pythonanywhere 的 StackTrace:
图片 link : https://i.stack.imgur.com/quXPI.png
尝试更改此行
file_path = f'{base_url}\media\{filename}'
至此
file_path = f'{base_url}/media/{filename}'
并在服务器中进行测试
如果您需要系统不可知路径(在 Windows 和 Linux 环境之间),请使用 os.path.join
或更好的 pathlib
来构建它们。
file_path = os.path.join(base_url, 'media', filename)
或 pathlib
base_url = pathlib.Path(__file__).resolve().parent.parent
然后
file_path = base_url / 'media' / filename
我想要实现的是让用户通过表单上传文件,比如个人资料图片,
我的目标是获取该文件,通过 imgbb 的 api 发送它并获取图像 url 以存储以供以后在我的模板中使用。
我能够通过下面的代码实现这一点,它在本地工作(Windows)但是一旦我推送到我的生产服务器(在这种情况下是 pythonanywhere),代码就会失败。
# CODE:
def testingpage(request):
image = ''
url = ''
if request.method == 'POST':
pic = request.FILES['image']
url = upload_to_bb(request, pic)
if url is not None:
from django.contrib import messages
messages.info(request, 'Uploaded Successfully')
return render(request, 'test.html', {'image': url})
def upload_to_bb(request, pic):
import os
from django.conf import settings
from django.core.files.storage import FileSystemStorage
import base64
import requests
base_url = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
fs = FileSystemStorage()
filename = fs.save(pic.name, pic)
file_path = f'{base_url}\media\{filename}'
apikey = settings.IMGBB_API_KEY
with open(file_path, "rb") as file:
url = "https://api.imgbb.com/1/upload"
payload = {
"key": apikey,
"image": base64.b64encode(file.read()),
}
r = requests.post(url, payload)
js = r.json()
if r.status_code == 200:
data = js['data']
file.close()
os.remove(file_path)
return data['image']['url']
else:
file.close()
os.remove(file_path)
from django.core.exceptions import ValidationError
raise ValidationError("An error occurred processing the image")
return None
罪魁祸首就是这行代码
file_path = f'{base_url}\media\{filename}'
在本地 windows 服务器上: 它returns
C:\Users\Sammy\PycharmProjects\kegites\media\WIN_20211209_15_41_37_Pro.jpg
在 pythonanywhere 上,我收到错误:
FileNotFoundError at /
[Errno 2] No such file or directory: '/home/kegitesclub/kegites\media\WIN_20211209_15_41_36_Pro_3afnrPi.jpg'
在 heroku 上,我得到:
No such file or directory: '/app\media\WIN_20211209_15_41_37_Pro.jpg'
是否与 linux 有关,这些服务器是或者是其他东西,也许是 Django 的限制?或者你能建议一个更好的方法来达到最终结果吗?
如有任何帮助,我们将不胜感激
pythonanywhere 的 StackTrace:
图片 link : https://i.stack.imgur.com/quXPI.png
尝试更改此行
file_path = f'{base_url}\media\{filename}'
至此
file_path = f'{base_url}/media/{filename}'
并在服务器中进行测试
如果您需要系统不可知路径(在 Windows 和 Linux 环境之间),请使用 os.path.join
或更好的 pathlib
来构建它们。
file_path = os.path.join(base_url, 'media', filename)
或 pathlib
base_url = pathlib.Path(__file__).resolve().parent.parent
然后
file_path = base_url / 'media' / filename