我可以很好地将照片上传到媒体文件夹。我的问题是我无法将它们保存到上传的特定文件夹中。我希望根据传入django视图的id将图像保存在一个唯一的文件夹中。下面是抛出以下错误的代码:
views.py“,第90行,顺序详细说明 settings.MEDIA_ROOT +'/ orders /'+ str(orderid)+'/'+ image) TypeError:强制转换为Unicode:需要字符串或缓冲区,找到InMemoryUploadedFile
if request.method == 'POST':
# Loop through our files in the files list uploaded
if not os.path.exists(settings.MEDIA_ROOT + '/orders/' + str(orderid)):
os.makedirs(settings.MEDIA_ROOT + '/orders/' + str(orderid))
for image in request.FILES.getlist('files[]'):
# Create a new entry in our database
new_image = UploadedImages(client_order=client, image=image.name)
# Save the image using the model's ImageField settings
filename, ext = os.path.splitext(image.name)
new_image.image.save("%s-%s%s" % (filename, datetime.datetime.now(), ext),
settings.MEDIA_ROOT + '/orders/' + str(orderid) + '/' + image)
new_image.save()
如果我只是使用图像,它只保存在媒体文件夹中找到。这是下面的代码。我知道我使用upload_to在我的模型中设置了一个文件夹。即便如此,我也不确定如何将其设置为基于ordierid的文件夹。
if request.method == 'POST':
# Loop through our files in the files list uploaded
if not os.path.exists(settings.MEDIA_ROOT + '/orders/' + str(orderid)):
os.makedirs(settings.MEDIA_ROOT + '/orders/' + str(orderid))
for image in request.FILES.getlist('files[]'):
# Create a new entry in our database
new_image = UploadedImages(client_order=client, image=image.name)
# Save the image using the model's ImageField settings
filename, ext = os.path.splitext(image.name)
new_image.image.save("%s-%s%s" % (filename, datetime.datetime.now(), ext), image)
new_image.save()
答案 0 :(得分:0)
您正在尝试连接字符串和文件对象'/' + image
您可能需要此处的文件名称,因此请尝试'/' + image.name
这可能会返回一些额外的路径信息,因此您必须将其删除才能获得文件名。
答案 1 :(得分:0)
经过一夜的搜索后,我找到了解决办法。我必须使用动态函数定义上传路径,然后将upload_to设置为该函数。
def image_upload_path(instance, filename):
return settings.MEDIA_ROOT + '/orders/{0}/{1}'.format(instance.client_order.invoice, filename)
class UploadedImages(models.Model):
...
image = models.ImageField(upload_to=image_upload_path)
这会将我的图像位置保存到正确的位置。