如何获取服务器上未找到/保存的所有ImageField的列表?

时间:2016-01-05 19:15:34

标签: mysql linux django centos

所以我有一张40,000张照片。它们都已被保存,但对于其中一些,当我在表中使用它们的路径时,图像实际上并未保存在服务器上。

这只会在某些时候发生,所以我想获得所有这些照片的列表,这样我就可以获取它们并手动将它们保存在我的服务器上。

我想要获取这些照片的ID或某种标识符,因为在我的表中,我还有图像的源URL,因此只需要在所有图片上使用wget要下载所有内容的源URL。

因此,例如,该表可能有3行:

photos/abc.jpg
photos/def.jpg
photos/ghi.jpg
找到

photos/abc.jpg,我会找到photos/def.jpg,但在照片文件夹中找不到photos/ghi.jpg

如何获取在ImageField中指定位置的服务器上找不到的所有图像名称或ID的列表。

3 个答案:

答案 0 :(得分:0)

只需使用来自DB的数据进行循环,然后检查文件是否存在函数

file_exists()

如果该函数返回false,那么在服务器上找不到文件,你可以将它添加到数组中,而不是服务器上没有文件的所有db记录列表

答案 1 :(得分:0)

Tra this

#change to the directory where dir photo is

$ cd /xx/yy
$ find photos/ -name \*.[Jj][Pp][Gg] -exec echo "insert IGNORE into tmptable VALUE(\"{}\");" \; >images.sql

# now you have a file image.sql where all insert in
# like:
# insert IGNORE into tmptable VALUE("photo/aa.jpg");
# insert IGNORE into tmptable VALUE("photo/aaac.jpg");

# Start mysql client

$ mysql -uroot -pXXXXXXX
> use yourDatabase;

# create a Table

> CREATE TABLE `tmptable` (
  `image` varchar(250) DEFAULT NULL,
  UNIQUE KEY `d` (`image`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# Import the file

> \. images.sql

# Now you can select the tmptable and join your table to find your missing images

答案 2 :(得分:0)

循环遍历表并检查每个项目(如果有文件)。

如果找不到文件,则从源代码下载(然后在每次下载后等待两秒钟,您不想泛洪源服务器)。

import urllib

for pic in Pictures.objects.all():
    if not pic.get_filename().exists():
        url = pic.get_source_url()
        urllib.urlretrieve(url, filename=pic.get_filename())

添加您自己的get_filename()get_source_url()方法。

由于这是一个Django问题:您可能想为您的Django应用程序制作此a management command,因此将来,您可以轻松地从CLI或甚至通过cronjob运行它,以自动修复丢失的图像