////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
////
:documentationPath: /plugins/actions/
:language: en_US
:page-alternativeEditUrl: https://github.com/apache/incubator-hop/edit/master/plugins/actions/ftpsget/src/main/doc/ftpsget.adoc
= Get a file with FTPS


== Description

The Get a file with FTPS action can get files with FTPS.

== Options

=== General Tab

[width="90%", options="header"]
|===
|Option|Description
|Workflow action name|The name of the workflow action. This name has to be unique in a single workflow.
|FTP server name / IP address|The FTP host.
|Port|The FTP port.
|Username|The FTP username.
|Password|The FTP password.
|Proxy host|The FTP proxy host.
|Proxy username|The FTP proxy username.
|Proxy password|The FTP proxy password.
|Connection type a|The type of connection to establish.

* FTP
* Implicit SSL
* Authentication SSL
* Implicit SSL with crypted FTP connection
* Authentication TLS
* Implicit TLS
* Implicit TLS with crypted FTP connection

|Test connection|Test the connection.
|Binary mode|Whether or not to use binary mode.
|Timeout|The timeout period.
|Use active FTPS connection|Whether or not to use an active FTPS connection.
|===

=== Files Tab

[width="90%", options="header"]
|===
|Option|Description
|Remote directory|The directory at the remote server.
|Check folder|Check if folder exists.
|Remove files after retrieval|Remove files at remote after download.
|Move files after retrieval|Move files at remote after download
|Move to folder|The folder in which moved files will be put.
|Create folder|Whether or not to create the folder.
|Target directory|The target directory.
|Browse...|Browse the filesystem to a target directory.
|Include date in filename| Whether or not to include the date in the file name.
|Include time in filename|Whether or not to include the time in the filename.
|Specify Date time format|
|Date time format|The date time format.
|Add date before extension|Add date before or after extension.
|Don't overwrite files|Whether or not to overwrite existing files.
|If files exists a|What to do if files already exist.

* Skip
* Give unique name to local file
* Fail
|Add filenames to result
|===
