2017-08-28 657 views
-1

我想显示使用Django,这已经是保存在MySQL数据库中的图片。在所有的方法中,我发现人们使用models.Imagefield(upload_to='path'),但我认为这会将文件保存到这个目录中,而其他计算机的人们以后将不能访问。 所以问题是,我如何直接访问数据库并显示图片而不保存它们之间?显示通过Django的图片保存在MySQL数据库

我已经成功地做到这一点在Python,但我不太清楚如何实现代码到models.py。 喜欢的东西,这是我的方法:

class mysqlpicture(models.Model): 
    #mysqlpic=something? 

    def openpic(): 
     connection = pymysql.connect(user='root', passwd='***', 
            host='localhost', 
            database='db') 

     cursor = connection.cursor() 

     sql1='select * from Pictures' 
     cursor.execute(sql1) 
     data=cursor.fetchall() 

     mysqlpic=io.BytesIO(data[1][0])#one means second element of column zero 

     #img=Image.open(mysqlpic) 
     #img.show() 
     cursor.close() 
     return mysqlpic 

,然后我在views.py试图直接给mysqlpic到的HttpResponse这样的:使用模板pic.html插入图片一样

def MysqlView(request): 
    query_results = mysqlpicture.objects.all() 
    template = loader.get_template('polls/pic.html') 
    context = { 
     'query_results': query_results, 
    } 
    return HttpResponse(template.render(context, request)) 

{% for n in query_results %} 
 
<mysqlpic src="{{ n.mysqlpic.url }}" /> 
 
{% endfor %}

有一个人在正确的道路的想法如何来的?

回答

0

您可以使用BinaryField这个目的。

但随着Django文档中所述:

虽然你可能会想到在数据库中存储的文件,认为它是坏的设计在99%的情况。

from django.db import models 

class MysqlPicture(models.Model): 
    mysqlpic = models.BinaryField() 
    # ... 

然后在模板来显示你可以二进制数据转换为Base64:

from base64 import b64encode 

def mysql_view(request): 
    query_results = MysqlPicture.objects.all() 
    template = loader.get_template('polls/pic.html') 
    context = { 
     'images': [b64encode(obj.mysqlpic) for obj in query_results], 
    } 
    return HttpResponse(template.render(context, request)) 

模板:

{% for image in images %} 
    <img src="data:;base64,{{ image }}"> 
{% endfor %} 
+0

如何将返回BinaryField然后在模型中,这样我可以在以后显示的画面?例如, – user8496104

+0

@ user8496104将您的二进制数据转换为base64。我更新了答案,请检查。 –

0

是,使用的ImageField也让人们从其他计算机稍后访问它。它继承了所有的属性和方法从的FileField将文件上传到在upload_to指定路径的服务器,并保存该路径到你的数据库,以保持其参考。所有这些都是在您的模型实例中调用save()方法时发生的。

然后,您可以通过在模板中调用your_instance.image_field.url来创建链接以建立链接。还请记住看看MEDIA_ROOTMEDIA_URL,它们分别告诉Django保存文件的服务器根路径以及处理从MEDIA_ROOT服务的媒体的url。

+0

如果只有图片的路径存储在数据库中,那并不意味着其他人需要以某种方式与我的计算机进行通信以获取图片的数据,或者当路径保存在图片上时它意味着什么数据库? – user8496104

+0

当然没有,这并不意味着。重点是什么? –

+0

像丹尼尔说的那样,这并不意味着......保存在数据库中的路径与MEDIA_ROOT中定义的根路径相关。当您调用_your_instance.image_field.url_时,将以您在MEDIA_URL中指定的格式创建链接,以便其他用户可以访问该图片。 –