Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download a remote image and save it to a Django model

I am writing a Django app which will fetch all images of particular URL and save them in the database.

But I am not getting on how to use ImageField in Django.

Settings.py

MEDIA_ROOT = os.path.join(PWD, "../downloads/")  # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://example.com/media/", "htp://media.example.com/" MEDIA_URL = '/downloads/' 

models.py

class images_data(models.Model):         image_id =models.IntegerField()         source_id = models.IntegerField()         image=models.ImageField(upload_to='images',null=True, blank=True)         text_ind=models.NullBooleanField()         prob=models.FloatField() 

download_img.py

def spider(site):         PWD = os.path.dirname(os.path.realpath(__file__ ))         #site="http://en.wikipedia.org/wiki/Pune"         hdr= {'User-Agent': 'Mozilla/5.0'}         outfolder=os.path.join(PWD, "../downloads")         #outfolder="/home/mayank/Desktop/dreamport/downloads"         print "MAYANK:"+outfolder         req = urllib2.Request(site,headers=hdr)         page = urllib2.urlopen(req)         soup =bs(page)         tag_image=soup.findAll("img")         count=1;         for image in tag_image:                 print "Image: %(src)s" % image                 filename = image["src"].split("/")[-1]                 outpath = os.path.join(outfolder, filename)                 urlretrieve('http:'+image["src"], outpath)                 im = img(image_id=count,source_id=1,image=outpath,text_ind=None,prob=0)                 im.save()                 count=count+1 

I am calling download_imgs.py inside one view like

        if form.is_valid():                 url = form.cleaned_data['url']                 spider(url) 
like image 575
Mayank Jain Avatar asked Apr 23 '13 15:04

Mayank Jain


People also ask

How do I add an image to a Django project?

In django we can deal with the images with the help of model field which is ImageField . In this article, we have created the app image_app in a sample project named image_upload. The very first step is to add below code in the settings.py file. MEDIA_ROOT is for server path to store files in the computer.

How do I store images in Django?

In Django, a default database is automatically created for you. All you have to do is add the tables called models. The upload_to tells Django to store the photo in a directory called pics under the media directory. The list_display list tells Django admin to display its contents in the admin dashboard.

Can we store images in Django database?

Most of the web applications deal with the file or images, Django provides the two model fields that allow the user to upload the images and files. These fields are FileField and ImageField; basically ImageField is a specialized version of FileField that uses Pillow to confirm that file is an image.

How do I save an object in Django?

To save changes to an object that's already in the database, use save() . This performs an UPDATE SQL statement behind the scenes. Django doesn't hit the database until you explicitly call save() .


1 Answers

Django Documentation is always good place to start

class ModelWithImage(models.Model):     image = models.ImageField(         upload_to='images',     ) 

UPDATED

So this script works.

  • Loop over images to download
  • Download image
  • Save to temp file
  • Apply to model
  • Save model

.

import requests import tempfile  from django.core import files  # List of images to download image_urls = [     'http://i.thegrindstone.com/wp-content/uploads/2013/01/how-to-get-awesome-back.jpg', ]  for image_url in image_urls:     # Stream the image from the url     response = requests.get(image_url, stream=True)      # Was the request OK?     if response.status_code != requests.codes.ok:         # Nope, error handling, skip file etc etc etc         continue          # Get the filename from the url, used for saving later     file_name = image_url.split('/')[-1]          # Create a temporary file     lf = tempfile.NamedTemporaryFile()      # Read the streamed image in sections     for block in response.iter_content(1024 * 8):                  # If no more file then stop         if not block:             break          # Write image block to temporary file         lf.write(block)      # Create the model you want to save the image to     image = Image()      # Save the temporary image to the model#     # This saves the model so be sure that it is valid     image.image.save(file_name, files.File(lf)) 

Some reference links:

  1. requests - "HTTP for Humans", I prefer this to urllib2
  2. tempfile - Save temporay file and not to disk
  3. Django filefield save
like image 116
rockingskier Avatar answered Oct 09 '22 01:10

rockingskier