|
|
|
Скачивание файла с фтп
|
|||
|---|---|---|---|
|
#18+
Дорабатываю программу, осуществляющую поиск по ftp серверам файлов с определенными разрешениями, для внесения их в базу mysql и дальнейшего анализа и поиска файлов через web. Например файл с расширением txt и объемом не больше 8 Кб скачивается полностью, и после определенной обработки его содержимое падает в базу данных... в этом случае файл полностью скачивается с сервера и проблем нет, проблема вознимает при обработке файла с расширением avi, у которого программа должна скачивать первые 8 Кб (и последние 8 Кб, если возможно), чтобы получить хэше байтовых последовательностей и в дальнейшем искать файлы с одинаковыми хэшами, но разными именами для постоения списка ftp зеркал для закачки... вот кусок кода который правильно скачивает txt файлы и сопутствующие функции чтения-записи... try { logOut("|> get: "+dir+name); // вначале пробуем скачать в пассивном режиме InetSocketAddress isa = getPasv(); if(isa != null) { try { write(socket1.getOutputStream(), "RETR "+dir+name+"\r\n"); socket2 = new Socket(); socket2.connect(isa, 30000); String reply = read(socket1.getInputStream()); if((reply.indexOf("4") != 0)&&(reply.indexOf("5") != 0)) { buf = read(socket2.getInputStream(), (int) size); if(reply.indexOf("\n1") < 0) if(reply.indexOf("\n2") < 0) if(reply.indexOf("\n3") < 0) if(reply.indexOf("\n4") < 0) if(reply.indexOf("\n5") < 0) read(socket1.getInputStream()); } else isa = null; socket2.close(); } catch(Exception ex){isa = null;} } if(isa == null) // если не получилось в пассивном - попытка скачать в активном { ServerSocket ss = new ServerSocket(0, 1, InetAddress.getLocalHost()); String reply = write("PORT "+ ss.getInetAddress().getHostAddress().replace('.',',')+ ","+((ss.getLocalPort()&0xff00)>>8)+ ","+(ss.getLocalPort()&0xff)+"\r\n"); if((reply.indexOf("4") == 0)||(reply.indexOf("5") == 0)) return; reply = write("RETR "+dir+name+"\r\n"); Socket socket2 = ss.accept(); buf = read(socket2.getInputStream(), (int) size); socket2.close(); ss.close(); if(reply.indexOf("\n1") < 0) if(reply.indexOf("\n2") < 0) if(reply.indexOf("\n3") < 0) if(reply.indexOf("\n4") < 0) if(reply.indexOf("\n5") < 0) read(socket1.getInputStream()); } // в случае успешной закачки - запуск вычислительного потока для обработки setDaemon(false); start(); } catch(Exception e){} функция read и write protected byte[] read(InputStream is, int lng) { byte buf[] = new byte[lng]; int off = 0, r = 1; try { while((r > 0)&&(off < lng)) { r = is.read(buf, off, buf.length-off); if(r > 0) { off += r; if(buf[off-1] == 0) r = 0; } } } catch(Exception e){} if(off > 0) { byte b[] = new byte[off]; for(r = 0; r < off; r++) b[r] = buf[r]; buf = b; System.gc(); } incoming += (long)lng; return buf; } protected void write(OutputStream os, String str) throws Exception { eventTime(); os.write(str.getBytes()); //logOut("> "+str); outcoming += str.length(); } в принципе, как я понимаю, после получения первой порции данных, размером 8Кб (на лету правится (int) size ) для файлов с расширением avi и размером больше 8 Кб требуется отправка команды ABOR и повторное установление соединения с сервером, но вот дальнейшая только у меня не получается правильно отправить сообщение через сокет и возникает ошибка при дальнейшей обработке полученного buf - если кто работал с ftp протоколом, как можно скачать только часть файла, возможно даже не с самого начала, а с заданной позиции ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 14:52:32 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2146173]: |
0ms |
get settings: |
13ms |
get forum list: |
30ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
58ms |
get topic data: |
22ms |
get first new msg: |
13ms |
get forum data: |
5ms |
get page messages: |
91ms |
get tp. blocked users: |
3ms |
| others: | 310ms |
| total: | 559ms |

| 0 / 0 |
