Einfacher FTP Client mit PL/SQL
Wusstet Ihr, dass man mit der Datenbank auch recht einfach auf einen FTP-Server zugreifen kann ...? Die Java-Engine in der Datenbank macht es möglich. Probiert mal das Skript hier aus ...
create or replace java source named ftp as
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.*;
import java.net.*;
import java.io.*;
public class SimpleFtp {
public static BLOB download(String psUrl) throws Exception {
URL url = new URL(psUrl + ";type=i");
URLConnection ucon = url.openConnection();
BufferedInputStream in = new BufferedInputStream(ucon.getInputStream());
Connection con = DriverManager.getConnection("jdbc:default:connection:");
BLOB blob = BLOB.createTemporary(con, true, BLOB.DURATION_SESSION);
OutputStream out = blob.getBinaryOutputStream();
int i = 0;
byte[] bytesIn = new byte[blob.getChunkSize()];
while ((i = in.read(bytesIn)) >= 0) {
out.write(bytesIn, 0, i);
}
out.close();
in.close();
con.close();
return blob;
}
public static void upload(String psUrl, BLOB blob) throws Exception {
URL url = new URL(psUrl + ";type=i");
URLConnection ucon = url.openConnection();
BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream(0L));
OutputStream out = ucon.getOutputStream();
int i = 0;
byte[] bytesIn = new byte[blob.getChunkSize()];
while ((i = in.read(bytesIn)) >= 0) {
out.write(bytesIn, 0, i);
}
out.close();
in.close();
}
}
/
sho err
alter java source ftp compile
/
sho err
create or replace package simple_ftp is
function ftp_download(p_url in varchar2) return blob;
procedure ftp_upload(p_url in varchar2, p_blob in blob);
end simple_ftp;
/
sho err
create or replace package body simple_ftp is
function ftp_download(p_url in varchar2) return blob
as language java name 'SimpleFtp.download(java.lang.String) return oracle.sql.BLOB';
procedure ftp_upload(p_url in varchar2, p_blob in blob)
as language java name 'SimpleFtp.upload(java.lang.String, oracle.sql.BLOB)';
end simple_ftp;
/
sho err
Ihr bekommt mit dem Paket SIMPLE_FTP einen stark vereinfachten FTP-Client, mit dem Ihr Dateien von einem FTP-Server als BLOB herunterladen oder einen BLOB auf einen Server hochladen könnt. Mehr kann er nicht - Folder anlegen, Dateien löschen oder ähnliche Dinge gehen nicht.
Normalerweise fehlen euch noch die nötigen Java-Privilegien, die es euch erlauben, über das Netz auf einen fremden Server zuzugreifen. Entweder gebt Ihr eurem DB-User die Rolle JAVASYSPRIV (sehr mächtig) oder Ihr vergebt die Zugriffsrechte auf die FTP-Server feingranular; was ich empfehlen würde.
call dbms_java.grant_permission( '[DB-User]', 'SYS:java.net.SocketPermission', '[host name]', 'resolve' ); call dbms_java.grant_permission( '[DB-User]', 'SYS:java.net.SocketPermission', '[IP address]', 'connect, resolve' );
Nun testen: Hochladen ...
SQL> exec simple_ftp.ftp_upload('ftp://ftpserver.mydomain.de/path/to/target-file', [blob]);
Herunterladen ...
SQL> select simple_ftp.ftp_download('ftp://ftpserver.mydomain.de/path/to/target-file') from dual;
SIMPLE_FTP.FTP_DOWNLOAD('FTP://FTPSERVER.MYDOMAIN.DE/PATH/TO/TARGET-FILE')
--------------------------------------------------------------------------------
2020202076617220675F636F6C5769647468203D2033303B0A2020202076617220675F6B65796D61
70456E7472696573203D206E756C6C3B0A2020202076617220675F6D65737361676573203D206E65
1 row selected.
Mit Login geht's auch ... einfach die URL wie folgt angeben:
ftp://username:password@host:port/rest/der/url. Aber bei FTP und Passwörtern immer dran denken: Sie werden stets im Klartext übertragen.