我正在上传图片,图片上传并将其保存在django模型中工作得很好。创建缩略图并将其保存到临时。位置也有效。不起作用的部分是保存缩略图,创建并保存文件,但它是一个空文件。 :/ 如何解决丢失数据的问题。
如果有人知道如何将pil图像转换为django模型 - imagefield而不进行tmp保存...请告诉我。
def ajax_upload(request):
if request.method == 'POST':
newfile = Image()
newfile.user = request.user
file_content = ContentFile(request.raw_post_data)
file_name = request.GET.get('file')
newfile.image.save(file_name, file_content)
# thumbnail creation ==========================================
path = os.path.join(settings.MEDIA_ROOT, newfile.image.url)
thumb_image = pil_image.open(path)
# ImageOps compatible mode
if thumb_image.mode not in ("L", "RGB"):
thumb_image = thumb_image.convert("RGB")
thumb_image_fit = ImageOps.fit(thumb_image, (32, 32), pil_image.ANTIALIAS)
#saving temp file
tmp_file_path = os.path.join(settings.MEDIA_ROOT, 'tmp_thumbnail.jpg')
thumb_image_fit.save(tmp_file_path, 'JPEG', quality=75)
#opening the tmp file and save it to django model
thumb_file_data = open(tmp_file_path)
thumb_file = File(thumb_file_data)
newfile.thumbnail.save(file_name, thumb_file)
#===============================================================
results = {'url': newfile.image.url, 'id': newfile.id, 'width': newfile.image.width, 'height': newfile.image.height}
return HttpResponse(json.dumps(results))
raise Http404
答案 0 :(得分:1)
您可以手动保存文件并将其路径(相对于MEDIA_ROOT)分配到目标字段。
thumb_path = 'uploads/1_small.jpg'
thumb_image_fit.save(os.path.join(MEDIA_ROOT, thumb_path), 'JPEG', quality=75)
newfile.thumbnail = thumb_path
当然你需要手动完成所有Django的东西 - 检查文件是否存在,修改名称,等等。
答案 1 :(得分:1)
from django.core.files.base import ContentFile
from PIL import ImageOps, Image as pil_image
import os.path
import json
def ajax_upload(request):
if request.method == 'POST':
newfile = Image()
newfile.user = request.user
file_content = ContentFile(request.raw_post_data)
file_name = request.GET.get('file')
newfile.image.save(file_name, file_content)
newfile.thumbnail.save(file_name, file_content)
#opening and resizing the thumbnail
path = os.path.join(settings.MEDIA_ROOT, newfile.thumbnail.url)
thumb_file = pil_image.open(path)
if thumb_file.mode not in ("L", "RGB"):
thumb_file = thumb_file.convert("RGB")
thumb_image_fit = ImageOps.fit(thumb_file, (100, 100), pil_image.ANTIALIAS)
thumb_image_fit.save(path)
#===============================================================
results = {
'image':
{
'url': newfile.image.path,
'width': newfile.image.width,
'height': newfile.image.height
},
'thumbnal':
{
'url': newfile.thumbnail.path,
'width': newfile.thumbnail.width,
'height': newfile.thumbnail.height
}
}
return HttpResponse(json.dumps(results))
raise Http404