< All Topics
Print

העתקת תוכן קובץ מ-SFTP לתיקייה לוקאלית

בכדי להעתיק קובץ הממוקם בתיקיית SFTP לתיקייה בשרת הלוקאלי / המחשב האישי, יש להשתמש ב-File connector.
העתקה תבוצע באמצעות הפונקציות file.read ו-file.write זאת מאחר ומיקום התיקייה ממנה מעתיקים הינה מסביבה אחרת.

להורדת ה-File connector, יש להוריד תחילה מהחנות של WSO2.

יש לוודא כי מתקינים את ה-Connector דרך ה- EI management console וגם דרך ה-Integration studio תחת הפרויקט הרלוונטי.

* כתיבת מסמך זה בוצעה בעבודה על IE 6.6.0 עם גרסה File connector 4.0.13.

יצירת API ראשי

להלן דוגמה של העתקת קובץ txt פשוט מתוך תיקייה ב-SFTP לתיקייה הלואקלית במחשב.
תחילה יש לייצר API שיקרא ל-Sequence.

<?xml version="1.0" encoding="UTF-8"?>
<api context="getTxt" name="getTxt" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="GET">
        <inSequence>
            <sequence key="saveTxtFromSftp"/>
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

יצירת Sequence לביצוע הפעולה

נייצר Sequence ושני local-entries, אחד עבור כל צד התחברות. (SFTP והסביבה הלוקאלית)
נתחיל בדוגמה ל-Sequence:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="saveTxtFromSftp" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <log level="full">
        <property name="INFO" value="Starting to copy the file from SFTP to local directory"/>
    </log>
    <file.read configKey="FILE_CONNECTION_1">
        <path>/SFTP_FOLDER/Outgoing</path>
        <filePattern>test.txt</filePattern>
        <readMode>Complete File</readMode>
        <includeResultTo>Message Body</includeResultTo>
        <enableStreaming>false</enableStreaming>
        <enableLock>true</enableLock>
    </file.read>
    <log level="full">
        <property name="INFO" value="File content read from SFTP"/>
    </log>
    <file.write configKey="LOCAL_PATH_CONNECTION">
        <filePath>C:/WSO2/files/test.txt</filePath>
        <contentOrExpression>{json-eval($.text)}</contentOrExpression>
        <mimeType>Automatic</mimeType>
        <compress>false</compress>
        <writeMode>Overwrite</writeMode>
        <enableStreaming>false</enableStreaming>
        <appendNewLine>false</appendNewLine>
        <enableLock>false</enableLock>
        <includeResultTo>Message Body</includeResultTo>
        <updateLastModified>true</updateLastModified>
    </file.write>
    <log level="full">
        <property name="INFO" value="File successfully written to local directory"/>
    </log>
</sequence>

בדוגמה זו, ניתן לראות כי מבצעים קריאה (file.read) של הקובץ txt מתוך ה-SFTP שפרטיו יפורטו ב-local-entry שנקרא FILE_CONNECTION_1.
ב-<path> למעשה נגדיר את הנתיב של מיקום הקובץ שאותו נרצה לקרוא, ב-<filePattern> נגדיר את שם הקובץ.
יש לוודא כי <includeResultTo> יכיל את הערך Message Body ע"מ שנוכל לקרוא את תוכן הקובץ.

לאחר מכן, אנו נבצע כתיבה של תוכן מה- Message Body על ידי שימוש ב- file.write, שם נחליט על מיקום ושם הקובץ במחשב האישי. (שימו לב כי צורת הכתיבה של תיקייה מתוך המחשב האישי ותיקייה ב-Linux שונה, במקרה השני יש לרשום תיקייה רלטיבית כמו שרשום ב-file.read)
ב-<contentOrExpression> נקרא למעשה את התוכן מתוך הפרמטר של הטקסט ולכן נשתמש ב-json-eval($.text).
ב-<writeMode> החלטנו כי כל פעם שהקובץ יועתק, יבוצע override על הקובץ הקודם אם היה, כמובן שאופציה זו ניתנת לשינוי.

יצירת local-entry עבור ה-SFTP (להעתקת הקובץ)

כעת נגדיר את ה-local-entry של ה-SFTP שנקרא FILE_CONNECTION_1:

<?xml version="1.0" encoding="UTF-8"?>
<localEntry key="FILE_CONNECTION_1" xmlns="http://ws.apache.org/ns/synapse">
    <file.init>
        <strictHostKeyChecking>false</strictHostKeyChecking>
        <connectionType>SFTP</connectionType>
        <password>aaaaa</password>
        <host>test.consist.co.il</host>
        <fileLockScheme>Local</fileLockScheme>
        <sftpConnectionTimeout>100000</sftpConnectionTimeout>
        <setAvoidPermission>false</setAvoidPermission>
        <userDirIsRoot>true</userDirIsRoot>
        <privateKeyPassword>bbbbb</privateKeyPassword>
        <port>1224</port>
        <name>FILE_CONNECTION_1</name>
        <sftpSessionTimeout>150000</sftpSessionTimeout>
        <privateKeyFilePath>C:/WSO2/consist.pem</privateKeyFilePath>
        <username>consist</username>
    </file.init>
</localEntry>

למעשה FILE_CONNECTION_1 מגדיר את ההתחברות ל-SFTP.
בדוגמה לעיל קיים private key (המפתח קיים בקובץ בעל סיומת pem.) שמוגדר בשרת/במחשב האישי. (שימו לב כי צורך הכתיבה של תיקייה מתוך המחשב האישי ותיקייה ב-Linux שונה, במקרה השני יש לרשום תיקייה רלטיבית כמו שרשום ב-file.read), שדה זה מוגדר ב-<privateKeyFilePath>.
מאחר ושמות השדות הם די אינטואטיביים לגבי מה כל אחד עושה, נדלג על ההסבר.
עם זאת, מומלץ לבדוק היטב את תקינות המפתח (קובץ pem) לפני השימוש וכן את פרטי ההתחברות ל-SFTP.
בכדי לעשות זאת, ניתן להשתמש ב-WinSCP לוודא תקינות החיבור.

יצירת local-entry עבור המחשב האישי (לשמירת הקובץ)

כעת, נגדיר את ה-local-entry של המחשב האישי שנקרא LOCAL_PATH_CONNECTION:

<?xml version="1.0" encoding="UTF-8"?>
<localEntry key="LOCAL_PATH_CONNECTION" xmlns="http://ws.apache.org/ns/synapse">
    <file.init>
        <connectionType>LOCAL</connectionType>
        <fileLockScheme>Local</fileLockScheme>
        <name>LOCAL_PATH_CONNECTION</name>
    </file.init>
</localEntry>

למעשה LOCAL_PATH_CONNECTION מגדיר את ההתחברות למחשב האישי.
מאחר ואנו משתמשים בנתיב של התיקייה בה ישמר קובץ ה-txt במחשב האישי ב-Sequence עצמו (תחת ה-file.write), אין צורך לציין כאן את מיקום התיקייה או את שם הקובץ, עם זאת, local-entry חובה לשימוש.

לאחר שביצענו את כל ההגדרות הללו, אם נריץ את ה-API לעיל, תבוצע קריאה וכתיבה של קובץ הטקסט מהתיקייה הרלוונטית ב-SFTP למחשב האישי.

תוכן עיניינים