FME從遠程服務器下載文件

一、前言

從遠程服務器下載文件其實主要用的是網絡傳輸協議。比如我有一個遠程文件url路徑:http://172.30.252.233:6688/文件下載/CAD數據/茨林.dwg,最簡單的方式就是在瀏覽器中打開這個網址,然後就會自動下載,因爲瀏覽器就是支持HTTP協議的。
但是如果我們有多個文件需要下載呢,一個個複製到瀏覽器內下載就顯得效率太低了,這個時候我們就可以使用FME的PythonCaller和HTTPCaller這兩個轉換器。兩者的本質都是一樣,使用HTTP傳輸協議下載文件。

二、中文編碼的問題

使用前需要注意的是,url中的中文部分是需要重新編碼的,否則會報編碼錯誤。但是網址域名部分是不需要重新編碼的,所以我們需要將兩者分開。
針對中文編碼錯誤的問題,我們使用TextEncoder轉換器,將中文內容轉換成百分比編碼的內容。
如果URL中的前綴部分,或者說當整個URL都不包含中文字符的時候,可以不用編碼轉換。

2.1 TextEncoder轉換器

如有我們有一個遠程文件URL包含中文,比如:
URL:http://172.30.233:6688/文件下載/CAD數據/茨林.dwg
我們想將其下載到我的電腦的本地路徑:E:\download\file\茨林.dwg
則我們需要創建以下字段:

prefix_url chinese_url download_url
http://172.30.233:6688/ 文件下載/CAD數據/茨林.dwg E:\\download\\file\\茨林.dwg

使用TextEncoder轉換器將chinese_url轉換成百分比編碼,輸出字段爲encoded_url,轉換器設置如下:
TextEncoder參數

將URL中的中文部分轉換編碼後,使用AttributeCreater轉換器將其和URL前綴部分連接起來。本例就是將prefix_url和encoded_url連接起來,輸出新的字段get_url。轉換器配置如下:
AttributeCreator參數

三、PythonCaller轉換器

PythonCaller轉換器可以在使得FME可以調用Python腳本和各類Python庫,這兩大數據處理工具的結合大大提升了數據處理的效率。因爲在Python中,使用urllib.urlretrieve(url, filenmae = none,…)函數就可以將遠程服務器上的文件下載到本地。其中url參數填寫遠程文件的地址,filename參數填寫本地保存路徑的地址。
PythonCaller轉換器內的代碼如下:

import fme
import fmeobjects
import urllib
def processFeature(feature):
    pass

class FeatureProcessor(object):
    def __init__(self):
        pass
    def input(self,feature):
        soururl = feature.getAttribute('geturl')		#獲取遠程文件路徑
        desturl = feature.getAttribute('downloadpath')  #本地文件的路徑
        filename = urllib.urlretrieve(soururl, desturl)	#調用urlretrieve方法下載文件
        self.pyoutput(feature)
    def close(self):
        pass

四、HTTPCaller轉換器

HTTPCaller轉換器的原理和在PythonCaller轉換器中調用urllib是一樣的,只不過HTTPCaller是功能封裝號,填入參數即可;而PythonCaller是通過代碼實現,代碼自由度高一些。HTTPCaller還可以用來獲取網頁內容,做一些爬蟲之類的,只不過在這裏用來下載文件。本文標出使用HTTPCaller轉換器下載文件所需要使用到的4個參數,如下。
HTTPCaller參數

五、工作流彙總

最後形成的工作流很簡單,如下圖所示。因爲不用輸出文件,所以也沒有寫模塊。好像File Copy寫模塊也可以實現從遠程服務器上下載文件,但是博主並沒有實現,會的人可以指教一下,博主很樂於學習。
最後偷偷安利一下我的個人博客,雖然沒什麼人看:藍線白框
fmeworkflow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章