使用AttachmentManager下载附件保存在单独的文件夹

1428
8
跳到解决方案
05-26-2021上午10:52
cschooley
通过
新贡献者III

我的问题是AttachmentManager模块。我编写了一个快速的代码,用于下载存储在ArcGIS在线上的一个特征层的所有附件。

############# 登录并设置  ############### 从arcgis。gis import gis PortalUrl = "https://www.arcgis.com" username = " password = "" FeatureLayerID = "e5c2bdc5755e4e21ab578550f2fa12a3" SavePath= r"C:\Users\cschooley\Documents\Work\Heritage\Photos" ################# End setup #######################如果用户名== "" "和密码= "":gis = gis () else: gis = gis (PortalUrl,用户名,密码)FeatureLayer = gis.content.get(FeatureLayerID) layer = FeatureLayer. "层[0]layer.attachments。下载(oid = 1, save_path=SavePath)

它工作得很好,但我遇到的问题是,当它保存到我创建的路径时,它为该功能的ObjectID和该功能的AttachmentID创建了一个新文件夹,将我的照片嵌套在两个自己的文件夹后面。

[" C: \ \ \ \ cschooley \ \用户文档\ \ \ \ \ \遗产工作照片\ \ 1 \ \ 18 \ \ 2015-04-11 10.35.42.jpg]

我想知道是否有一种方法来解决这个问题。我想让照片直接保存到“photos”文件夹中,而不需要创建其他文件夹。

我想使用os模块可以工作,但这有点超出我的理解。我发现这篇文章对我很有帮助,但我无法让他的代码为我工作,这就是为什么我在上面写了这篇。它更简单,没有我不需要的额外的东西。我只需要下载照片,不一定要附上所有的信息(objectid等)。

谢谢你!

附注:代码中使用的特性ID是一个公共ID,而不是我实际尝试使用的ID,因为该ID在我的组织中受到保护。它来自JoshuaTreeHike功能服务器。这与我的设置相同,即附件id不一定与objectid匹配。

标签(5)
0荣誉
1解决方案

接受的解决方案
FredericPRALLY
Esri贡献者

嗨cshooley,

也许你可以使用这个解决方案与os和shutil模块复制jpg下载后的照片dirname如下:

############# 登录并设置  ############### 进口操作系统从arcgis进口shutil。gis import gis PortalUrl = "https://www.arcgis.com" username = " password = "" FeatureLayerID = "e5c2bdc5755e4e21ab578550f2fa12a3" SavePath= r"C:\Users\cschooley\Documents\Work\Heritage\Photos" ################# End setup #######################如果用户名== "" "和密码= "":gis = gis () else: gis = gis (PortalUrl,用户名,密码)FeatureLayer = gis.content.get(FeatureLayerID) layer = FeatureLayer. "层[0]layer.attachments。下载(oid = 1, save_path=SavePath) ################# Copy image ####################### for root, dirs, files in os.walk(SavePath): for f in files: if f.endswith('.jpg'): print("Copy jpg: {0}".format(str(f))) pathOriginal = os.path.join(root,f) pathTarget = os.path.join(SavePath,f) shutil.copyfile(pathOriginal, pathTarget) ### remove folders into Photos if you want ##for d in os.listdir(SavePath): ## if os.path.isdir(os.path.join(SavePath,d)): ## shutil.rmtree(os.path.join(SavePath,d))

希望这对你有所帮助,

最好的问候,

弗雷德

在原帖子中查看解决方案

8回答说
FredericPRALLY
Esri贡献者

嗨cshooley,

也许你可以使用这个解决方案与os和shutil模块复制jpg下载后的照片dirname如下:

############# 登录并设置  ############### 进口操作系统从arcgis进口shutil。gis import gis PortalUrl = "https://www.arcgis.com" username = " password = "" FeatureLayerID = "e5c2bdc5755e4e21ab578550f2fa12a3" SavePath= r"C:\Users\cschooley\Documents\Work\Heritage\Photos" ################# End setup #######################如果用户名== "" "和密码= "":gis = gis () else: gis = gis (PortalUrl,用户名,密码)FeatureLayer = gis.content.get(FeatureLayerID) layer = FeatureLayer. "层[0]layer.attachments。下载(oid = 1, save_path=SavePath) ################# Copy image ####################### for root, dirs, files in os.walk(SavePath): for f in files: if f.endswith('.jpg'): print("Copy jpg: {0}".format(str(f))) pathOriginal = os.path.join(root,f) pathTarget = os.path.join(SavePath,f) shutil.copyfile(pathOriginal, pathTarget) ### remove folders into Photos if you want ##for d in os.listdir(SavePath): ## if os.path.isdir(os.path.join(SavePath,d)): ## shutil.rmtree(os.path.join(SavePath,d))

希望这对你有所帮助,

最好的问候,

弗雷德

cschooley
通过
新贡献者III

谢谢你!效果很好。我已经弄清楚了如何用这段代码获得我所有文件的列表:

list_dir = [] for root, dirs, files, in os.walk(SavePath): for file in files: list_dir.append(file)

但不能再进一步了。现在我想我可以用你的

对于root, dirs, os.walk(SavePath)中的文件:对于f中的文件:if f.n endswith('.jpg'): print(r"Copy jpg: {0}") PathOriginal = os.path.join(root,f) PathTarget = os.path. path。join(SavePath, f)拷贝文件(PathOriginal PathTarget)

获取所有文件,而不仅仅是jpeg。像这样:

对于root, dirs, os.walk(SavePath)中的文件:对于f中的文件:print("Copy jpg: {0}".format(str(f)) PathOriginal = os.path.join(root,f) PathTarget = os.path。join(SavePath, f)拷贝文件(PathOriginal PathTarget)

再次感谢!

0荣誉
cschooley
通过
新贡献者III

第二个问题,我不知道你能不能帮我,但如果有些照片有相同的名字,应该有办法重新命名双打,对吧?这样它们就不会互相覆盖了?

0荣誉
FredericPRALLY
Esri贡献者

最好的方法是在复制之前检查jpg名称是否存在。

看到https://pro.arcgis.com/en/pro-app/latest/arcpy/get-started/checking-for-existence.htm

0荣誉
cschooley
通过
新贡献者III

正确的。因此,这检查是否存在某些东西,但对shutil的问题没有帮助。如果存在某些内容,则复制覆盖。我正在从一个功能层下载附件,其中不同层上的附件具有相同的名称,但不是相同的图片,我想要所有的图片。

从我的阅读,我需要添加这样的东西来重命名他们之前,他们保存:

而os.path。Exists (f + "_" + str(i)): i+=i

当然不完全是这样,但要在它的末尾添加一个数字或其他东西,这样它就不会覆盖之前的图像。

0荣誉
FredericPRALLY
Esri贡献者

你好,

尝试下面的完整脚本:

############# 登录并设置  ############### 进口操作系统从arcgis进口shutil。gis import gis PortalUrl = "https://www.arcgis.com" username = " password = "" FeatureLayerID = "e5c2bdc5755e4e21ab578550f2fa12a3" SavePath= r"C:\Users\cschooley\Documents\Work\Heritage\Photos" ################# End setup #######################如果用户名== "" "和密码= "":gis = gis () else: gis = gis (PortalUrl,用户名,密码)FeatureLayer = gis.content.get(FeatureLayerID) layer = FeatureLayer. "层[0]layer.attachments。下载(oid = 1, save_path=SavePath) ################# Copy image ####################### for root, dirs, files in os.walk(SavePath): for f in files: if f.endswith('.jpg'): print("Copy jpg: {0}".format(str(f))) pathOriginal = os.path.join(root,f) pathTarget = os.path.join(SavePath,f) if os.path.exists(pathTarget): pathTarget = pathTarget[:-4] + "_copy" + pathTarget[-4:] shutil.copyfile(pathOriginal, pathTarget) ### remove folders into Photos if you want for d in os.listdir(SavePath): if os.path.isdir(os.path.join(SavePath,d)): shutil.rmtree(os.path.join(SavePath,d))

希望这对你有所帮助,

问候,

弗雷德

cschooley
通过
新贡献者III

谢谢你!我能挺过去这一个做一个适合我的。

0荣誉
UriGilad_EsriAu
Esri贡献者

@cschooley

看看我创建的这个工具-可能会有帮助:

//www.gobook3.com/t5/arcgis-pro-blog/export-attachments-toolbox/ba-p/1022018

如果这个答案解决了你的问题,或者如果你觉得它有帮助,请相应地标记它,以帮助其他有同样问题的人。
0荣誉