所以我有一张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的列表。
答案 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运行它,以自动修复丢失的图像