# How to Move FTP Image

**URL:** <https://discourse.nodered.org/t/how-to-move-ftp-image/89171>\
**Category:** General\
**Tags:** function-node\
**Created:** [2 July 2024 05:55 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171 "2024-07-02T05:55:58Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![user1234](https://avatars.discourse-cdn.com/v4/letter/u/47e85d/32.png) [@user1234](https://discourse.nodered.org/u/user1234)\
**Post date:** [2 July 2024 05:55 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171/1 "2024-07-02T05:55:58Z")

</div>

I require assistance with my existing workflow. The objective is to duplicate a camera image from an FTP location to a local one. The local destination should only contain two types of images: the regular camera image and the textured camera image. Subsequently, the local images should be transferred to a new FTP using the data name from the source path. Following this, the source path should delete the image. It is worth noting that triggering the process results in obtaining two images: the textured image and the regular image.

Here my Flow:

```auto
[
    {
        "id": "0e7e414cf9817c49",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP List",
        "func": "msg.host = \"192.168.0.1\";\nmsg.port = 21;\nmsg.user = \"user12\";\nmsg.password = \"pass\";\nmsg.operation = \"LIST\";\nmsg.filename = \"/File/\";\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 700,
        "y": 520,
        "wires": [
            [
                "1ff00035aafc8b87"
            ]
        ]
    },
    {
        "id": "1ff00035aafc8b87",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP LIST",
        "x": 880,
        "y": 520,
        "wires": [
            [
                "7b9411f132639055",
                "6aad94dcf8d25c7e"
            ]
        ]
    },
    {
        "id": "7b9411f132639055",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 44",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1060,
        "y": 520,
        "wires": []
    },
    {
        "id": "1fb29a0b762626ec",
        "type": "inject",
        "z": "09b8638e2f511e95",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "timestamp",
        "payloadType": "str",
        "x": 480,
        "y": 520,
        "wires": [
            [
                "0e7e414cf9817c49"
            ]
        ]
    },
    {
        "id": "6aad94dcf8d25c7e",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP List Unterordner",
        "func": "global.set(\"PL12subfolder\", msg.payload[0].name)\nmsg.host = \"192.168.0.2\";\nmsg.port = 21;\nmsg.user = \"user12\";\nmsg.password = \"pass\";\nmsg.operation = \"LIST\";\nmsg.filename = \"/File/\" + msg.payload[0].name + \"/\"; // File/Date/\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1320,
        "y": 520,
        "wires": [
            [
                "b55f368bff29971a",
                "3eb85fc943646f60"
            ]
        ]
    },
    {
        "id": "b55f368bff29971a",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP LIST",
        "x": 1520,
        "y": 520,
        "wires": [
            [
                "9264249947734336",
                "9c4457ba05aefa44"
            ]
        ]
    },
    {
        "id": "3759051461f9c621",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 45",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 3020,
        "y": 800,
        "wires": []
    },
    {
        "id": "9264249947734336",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP GET Normal",
        "func": "\n\nfor (let i = 0; i < msg.payload.length; i++) {\n if (msg.payload.includes(\"CAM_Normal\")) {\n let file = \"/File/\" + global.get(\"PL12subfolder\") + \"/\" + msg.payload[i].name;\n global.set(\"CurrentData_N\", msg.payload[i].name);\n global.set(\"CurrentSourcePath\", file);\n\n msg.host = \"192.168.0.1\";\n msg.port = 21;\n msg.user = \"user12\";\n msg.password = \"pass\";\n msg.operation = \"GET\";\n msg.filename = file;\n msg.localFilename = \"/home/Folder/pic/normal.\" + msg.payload[i].name;\n }\n}\nreturn msg;\n\n\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1750,
        "y": 520,
        "wires": [
            [
                "b7f70e051031b7d5"
            ]
        ]
    },
    {
        "id": "e1e6dcbe7937d7e0",
        "type": "image viewer",
        "z": "09b8638e2f511e95",
        "name": "Normal_viewer",
        "width": "1090",
        "data": "payload",
        "dataType": "msg",
        "active": true,
        "x": 3040,
        "y": 840,
        "wires": [
            []
        ]
    },
    {
        "id": "b7f70e051031b7d5",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP GET",
        "x": 2000,
        "y": 520,
        "wires": [
            [
                "e894a1123e8edda3",
                "976b9bf8bc882721"
            ]
        ]
    },
    {
        "id": "e6e4e6d279deb301",
        "type": "file in",
        "z": "09b8638e2f511e95",
        "name": "",
        "filename": "/home/folder/pic/Normal_cam.jpg",
        "filenameType": "str",
        "format": "",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 2720,
        "y": 780,
        "wires": [
            [
                "e1e6dcbe7937d7e0",
                "3759051461f9c621",
                "e6dceb8ed397fe5b"
            ]
        ]
    },
    {
        "id": "e894a1123e8edda3",
        "type": "change",
        "z": "09b8638e2f511e95",
        "name": "",
        "rules": [
            {
                "t": "delete",
                "p": "filename",
                "pt": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 2420,
        "y": 520,
        "wires": [
            [
                "e6e4e6d279deb301",
                "64ceb40b5fdee944"
            ]
        ]
    },
    {
        "id": "976b9bf8bc882721",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 46",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 2200,
        "y": 520,
        "wires": []
    },
    {
        "id": "3eb85fc943646f60",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 47",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1520,
        "y": 480,
        "wires": []
    },
    {
        "id": "e6dceb8ed397fe5b",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP PUT Normal",
        "func": "\n\nmsg.host = \"192.168.168.1\";\nmsg.port = 21;\nmsg.user = \"user45\";\nmsg.password = \"pass45\";\nmsg.operation = \"PUT\";\nmsg.filename = \"/PL12_VkMag_OCR/Normal.\" + global.get(\"CurrentData_N\");\nmsg.localFilename = \"/home/eeu/pic/PL12_VK_Mag_Keyence/normal.jpg\";\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 3330,
        "y": 780,
        "wires": [
            [
                "49add75119c55262",
                "fbc10b211041bd98"
            ]
        ]
    },
    {
        "id": "49add75119c55262",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP PUT Normal",
        "x": 3710,
        "y": 780,
        "wires": [
            [
                "a404f1d683dd75f3",
                "8971d54a8dc5a615"
            ]
        ]
    },
    {
        "id": "a404f1d683dd75f3",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 48",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 3680,
        "y": 720,
        "wires": []
    },
    {
        "id": "fbc10b211041bd98",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 49",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 3300,
        "y": 720,
        "wires": []
    },
    {
        "id": "8971d54a8dc5a615",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP DELETE",
        "func": " let file = global.get(\"CurrentSourcePath\");\n\n msg.host = \"192.168.0.1\";\n msg.port = 21;\n msg.user = \"user12\";\n msg.password = \"pass\";\n msg.operation = \"DELETE\";\n msg.filename = file;\n \nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 3320,
        "y": 820,
        "wires": [
            [
                "f94b6fa7811d5293"
            ]
        ]
    },
    {
        "id": "f94b6fa7811d5293",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP Texture Delete",
        "x": 3710,
        "y": 820,
        "wires": [
            [
                "a0e1d63b155fd045"
            ]
        ]
    },
    {
        "id": "a0e1d63b155fd045",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 50",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 3680,
        "y": 880,
        "wires": []
    },
    {
        "id": "709d77ed12fdfe12",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP PUT Texture",
        "func": "\n\nmsg.host = \"192.168.168.1\";\nmsg.port = 21;\nmsg.user = \"user45\";\nmsg.password = \"pass45\";\nmsg.operation = \"DELETE\";\nmsg.filename = \"/PL12_VkMag_OCR/Texture.\" + global.get(\"CurrentData_T\");\nmsg.localFilename = \"/home/eeu/pic/PL12_VK_Mag_Keyence/texture.jpg\";\nreturn msg;\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 3310,
        "y": 520,
        "wires": [
            [
                "4b1005f411b29095",
                "6acb924e67911309"
            ]
        ]
    },
    {
        "id": "4b1005f411b29095",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP PUT Texture",
        "x": 3710,
        "y": 520,
        "wires": [
            [
                "b10e27731810c6e0",
                "2d5bb472a178910b"
            ]
        ]
    },
    {
        "id": "b10e27731810c6e0",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 51",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 3680,
        "y": 460,
        "wires": []
    },
    {
        "id": "6acb924e67911309",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 52",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 3280,
        "y": 460,
        "wires": []
    },
    {
        "id": "2d5bb472a178910b",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP DELETE Texture",
        "func": " let file = global.get(\"CurrentSourcePath\");\n\n msg.host = \"192.168.0.1\";\n msg.port = 21;\n msg.user = \"user12\";\n msg.password = \"pass\";\n msg.operation = \"DELETE\";\n msg.filename = file;\n \nreturn msg;\n\n\n\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 3320,
        "y": 560,
        "wires": [
            [
                "e093c8bab035b7e0"
            ]
        ]
    },
    {
        "id": "e093c8bab035b7e0",
        "type": "ftp",
        "z": "09b8638e2f511e95",
        "name": "FTP Normal Delete",
        "x": 3710,
        "y": 560,
        "wires": [
            [
                "3af5796e58dcd6c3"
            ]
        ]
    },
    {
        "id": "3af5796e58dcd6c3",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 53",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 3680,
        "y": 620,
        "wires": []
    },
    {
        "id": "64ceb40b5fdee944",
        "type": "file in",
        "z": "09b8638e2f511e95",
        "name": "",
        "filename": "/home/folder/pic/Texture_cam.jpg",
        "filenameType": "str",
        "format": "",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 2720,
        "y": 520,
        "wires": [
            [
                "709d77ed12fdfe12",
                "6b87dd05eaad64d6",
                "498add32e38c4b2d"
            ]
        ]
    },
    {
        "id": "6b87dd05eaad64d6",
        "type": "debug",
        "z": "09b8638e2f511e95",
        "name": "debug 54",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 3020,
        "y": 540,
        "wires": []
    },
    {
        "id": "498add32e38c4b2d",
        "type": "image viewer",
        "z": "09b8638e2f511e95",
        "name": "Texture_viewer",
        "width": "1090",
        "data": "payload",
        "dataType": "msg",
        "active": true,
        "x": 3040,
        "y": 580,
        "wires": [
            []
        ]
    },
    {
        "id": "9c4457ba05aefa44",
        "type": "function",
        "z": "09b8638e2f511e95",
        "name": "FTP GET Texture",
        "func": "\n\n\n\nfor (let i = 0; i < msg.payload.length; i++) {\n\n if (msg.payload.includes(\"CAM_Texture\")) { // If Datapath contains String (\"CAM_Texture\") \n let file = \"/File/\" + global.get(\"PL12subfolder\") + \"/\" + msg.payload[i].name;\n global.set(\"CurrentData_T\", msg.payload[i].name);\n global.set(\"CurrentSourcePath\", file);\n\n\n msg.host = \"192.168.0.1\";\n msg.port = 21;\n msg.user = \"user12\";\n msg.password = \"pass\";\n msg.operation = \"GET\";\n msg.filename = file;\n msg.localFilename = \"/home/Folder/pic/texture.\" + msg.payload[i].name;\n }\n}\n\nreturn msg;\nmsg.host = \"192.168.0.1\";\nmsg.port = 21;\nmsg.user = \"user12\";\nmsg.password = \"pass\";",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1750,
        "y": 560,
        "wires": [
            [
                "b7f70e051031b7d5"
            ]
        ]
    }
]

```

---

<div class="post-metadata">

**Author:** ![Trying\_to\_learn](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/trying_to_learn/32/28400_2.png) [@Trying\_to\_learn](https://discourse.nodered.org/u/Trying_to_learn)\
**Post date:** [2 July 2024 09:34 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171/2 "2024-07-02T09:34:29Z")

</div>

So:

The camera takes a piccie (remote to NR).

The picture is copied to the NR machine (FTP)  
The picture is then.... _textured_

The picture (the new one that is textured) is **MOVED** to another computer. (FTP)  
Delete the picture on the NR machine. (Both?)

Is that right?

The flow you posted.  
Suggestion:  
It makes it difficult for people to use it if they have different IP numbers, etc.

Try to make the flow stand alone for only that machine.  
EG:  
3 directories - remote1, local, remote2  
Put the original picture in `remote1`, it _moves_ it to `local` where it is _textured_ then moved to `remote2`  
That would be easier for people to use.

---

<div class="post-metadata">

**Author:** ![user1234](https://avatars.discourse-cdn.com/v4/letter/u/47e85d/32.png) [@user1234](https://discourse.nodered.org/u/user1234)\
**Post date:** [2 July 2024 10:49 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171/3 "2024-07-02T10:49:40Z")

</div>

> [@Trying\_to\_learn](#):
>
> The picture (the new one that is textured) is **MOVED** to another computer. (FTP)  
> Delete the picture on the NR machine. (Both?)

yes, Both

> [@Trying\_to\_learn](#):
>
> Is that right?

not completly, i get at the same time a texture and a normal image, which i get from another flow.

so the order is just like you thought remote1 -\>local -\>remote2-\> DELETE Images remote1

sorry for the flow, thanks you for your suggestion 😊

---

<div class="post-metadata">

**Author:** ![Trying\_to\_learn](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/trying_to_learn/32/28400_2.png) [@Trying\_to\_learn](https://discourse.nodered.org/u/Trying_to_learn)\
**Post date:** [2 July 2024 10:52 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171/4 "2024-07-02T10:52:16Z")

</div>

Yeah, sorry I couldn't be of more help.

(You may notice I am kinda busy with a problem myself.)

But anyway: good luck with it.

What you are wanting to do is not impossible.  
I guess it is just a _trick_ of _remembering_ all the names.  
😉

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [2 July 2024 11:55 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171/5 "2024-07-02T11:55:17Z")

</div>

As it stands, your flow is useless as it is missing wires and showing no data for anyone to test with

If I understand you there is a remote site with photos on it, let's call it Site-A. You have Node-RED running on a local device, let's call it Local-B. And there is another remote site you want to send the photos to, lets call it Site-B.

you should break your task into subtasks  
a) create a flow that will grab the images from the remote site using FTP and store them in a folder on the device running NR  
b) create a flow to FTP the photos to Site-C  
c) create a flow to delete the files from Site-A

The first thing you should do is create a flow that will FTP the photos from Site-A and store them in a folder on Local-B. This raises some questions:

- do you have authorization to access the files on Site-A?
- how will you determine what files to FTP to Local-B?
- How will you know when to look for and transfer the files?
- Will you have authority to delete the files once you have retrieved them?

Once you have that working you can create a second flow which will use FTP to send the files from Local-B to Site-C.

Then you need a flow to delete the files from Site-A.

If the photos need to be moved once they are created and you could run NR on Site-A this would be much easier. You use a `watch` node to watch the folder that the photos will be added to, then have NR FTP those files to Site-C and when done, use one of the file nodes to delete the photos that were just sent to Site-C.

If the object is just to move the files from Site-A to Site-C, why not create a sci

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [30 September 2024 11:55 UTC](https://discourse.nodered.org/t/how-to-move-ftp-image/89171/6 "2024-09-30T11:55:50Z")

</div>

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.
