co rozumiesz przez "makro"? natomiast z twoich podanych pomyslow, oczywiscie ze to wszystko jest do zrobienia, wrecz niemal ba(na)nalnie proste

.
zapis do bazy:
<?php
$pdo->query('INSERT INTO `table` (`file`) VALUES ('' . $pdo->quote( file_get_contents('nazwa_pliku') ) . '')'); ?>
gdzie `file` to jakies pole typu BLOB (w postgresie to BYTEA chyba sie nazywa).
oczywiscie to w wielkim uproszczeniu, najlepiej uzyc tutaj prepared statement i uzyc PDO::PARAM_BLOB.
na FTP:
manual PHP -> ftp_connect() + ftp_login() + ftp_put() + ftp_close().
generowanie pliku to po prostu jego wypisywanie. wypisujesz po prostu zawartosc ewentualnie przedtem wysylajac:
<?php
header('Content-Type: application/octet-stream'); ?>
+ ewentualnie Content-Disposition z nazwa pliku