01.Do czego to ma służyć
Często słuchamy fajnego kawałka na wrzucie i chcemy go ściągnąć na dysk,
wtedy zastanawiamy się jak to ściągnąć. Metoda jest bardzo łatwa, przedstawiam ją poniżej.
Cały program, gotowy do otworzenia (exe) znajduje się w linku poniżej:
Naciśnij czytaj dalej, aby zobaczyć algorytm zaimplementowany w C++/Java.
02.Algorytm
Mamy przykładowy link:
http://www.wrzuta.pl/audio/6HeShIhpgL/fenomen-powiedz
Aby wywołać ściągnięcie pliku z serwera ftp wrzuty, musimy link zamienić na postać:
http://www.wrzuta.pl/aud/file/6HeShIhpgL/1
Widzimy, audio zamienić na aud lub vid(w przypadku filmów), po tym dodać file/kod oraz na końcu jakąś cyfrę.
03.Implementacja
Wczytujemy link, dzielÄ…c je miÄ™dzy ‘/’ wrzucamy do tablicy. Odpowiednie części tablicy
zamieniamy i między nie, dodajemy /file/.
Obiekty:
string adres_down; //Adres,ktory wczytujemy(http://www.wrzuta.pl/audio/6HeShIhpgL/fenomen-powiedz )
string adres_new; //Adres,ktory chcemy otrzymac(http://www.wrzuta.pl/aud/file/6HeShIhpgL/1)
string skladowe[6]; //6 czesci, na ktore dzielimy link (obiekt adres_down)
Cała funkcja zmien_adres();
Kod:
string zmien_adres(string adres_down) //W argumencie funkcji podajemy stringa z adresem do wczytania
{
int x,dlugosc,y=0; //zmienne
string bufor,rodzaj; //zmienne
/* Cala petla, dzielaca linka na skladowe */
for(x=1; x<=adres_down.length(); ++x)
{
if (adres_down[x]==’/') //Idzie od lewej, jeżeli znajdzie ‘/’
{
skladowe[y]=bufor; //Przypisze do skladowe[y] to co jest w buforze
bufor=”"; //wyzeruje bufor
y++; //inkrementuje zmienna y
}
else //w przeciwnym wypadku,idzie do nastepnej czesci
{
bufor+=adres_down[x];
}
}
skladowe[y]=bufor; //ostatnia czesc skladowych przypisujemy zmiennej bufor
/*Okreslamy jaki jest rodzaj pliku*/
if (skladowe[3]==”film”) rodzaj=”/vid”;
if (skladowe[3]==”audio”) rodzaj=”/aud”;
//kompletny link
adres_new=”http://”+skladowe[2]+rodzaj+”/file/”+skladowe[4]+”/1″ ;
return adres_new;
}
04.Jak ściągnąć plik, czyli UrlDownloadToFile.
Adres do dokladnego opisu biblioteki: [ www ]
Inicjalizacja: (zgodnie z MSDN Library)
Kod:
typedef HRESULT (*P_URLDownloadToFile)(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
void*
);
HRESULT uRet = 1;
HINSTANCE hLib;
HMODULE urlmon=LoadLibrary(”urlmon.dll”);
if(urlmon)
_URLDownloadToFile=(P_URLDownloadToFile)GetProcAddress(url mon,”URLDownloadToFileA”);
uRet = _URLDownloadToFile(NULL,adres_new.c_str(),plik.c_str(),0,NULL); //Funkcja c.str() zamienia zawartość obiektu string na C-string.
if ( uRet == S_OK )
{ std::cout << “\nPobieranie zakonczone pomyslnie!:))\n” << endl; }
else { std::cout << “\nBlad pobierania!\n” << endl; break;}
FreeLibrary(hLib);
/******************************************
* 05.Kompletny kod *
*******************************************/
Kod:
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
typedef HRESULT (*P_URLDownloadToFile)(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
void*
);
/*****************************************/
string adres_down;
string adres_new;
string skladowe[6];
/****************************************/
string zmien_adres(string adres_down)
{
int x,dlugosc,y=0;
string bufor,rodzaj;
for(x=1; x<=adres_down.length(); ++x)
{
if (adres_down[x]==’/')
{
skladowe[y]=bufor;
bufor=”";
y++;
}
else
{
bufor=bufor+adres_down[x];
}
}
cout << bufor;
skladowe[y]=bufor;
if (skladowe[3]==”film”) rodzaj=”/vid”;
if (skladowe[3]==”audio”) rodzaj=”/aud”;
adres_new=”http://”+skladowe[2]+rodzaj+”/file/”+skladowe[4]+”/1″ ;
return adres_new;
}
////////////////////////////////////////////////////////////////
P_URLDownloadToFile _URLDownloadToFile;
int main()
{
string adres;
string plik;
while(1)
{
cout << “Adres(z http://www.):”;
cin >> adres;
cout << endl;
cout << “Wpisz nazwe pliku: “;
cin >> skladowe[4];
plik = skladowe[4] + “.mp3″;
zmien_adres(adres);
cout << “+ Link wzgledny:” << adres_new << endl << ” Download… \n\n”;
HRESULT uRet = 1;
HINSTANCE hLib;
HMODULE urlmon=LoadLibrary(”urlmon.dll”);
if(urlmon)
_URLDownloadToFile=(P_URLDownloadToFile)GetProcAddress(url mon,”URLDownloadToFileA”);
uRet = _URLDownloadToFile(NULL,adres_new.c_str(),plik.c_str(),0,NULL);
if ( uRet == S_OK )
{ std::cout << “\nPobieranie zakonczone pomyslnie!:))\n” << endl; }
else { std::cout << “\nBlad pobierania!\n” << endl; break;}
FreeLibrary(hLib);
}
getch();
}
Implementacja w Javie:
-
import java.io.*;
-
import java.net.*;
-
import java.util.*;
-
import java.util.Arrays;
-
-
public class FileDownload {
-
public static void download(String address, String localFileName) {
-
OutputStream out = null;
-
URLConnection conn = null;
-
InputStream in = null;
-
try {
-
URL url = new URL(address);
-
out = new BufferedOutputStream(
-
new FileOutputStream(localFileName));
-
conn = url.openConnection();
-
in = conn.getInputStream();
-
byte[] buffer = new byte[1024];
-
int numRead;
-
long numWritten = 0;
-
while ((numRead = in.read(buffer)) != -1) {
-
out.write(buffer, 0, numRead);
-
numWritten += numRead;
-
}
-
System.out.println(localFileName + “\t“ + numWritten);
-
} catch (Exception exception) {
-
exception.printStackTrace();
-
} finally {
-
try {
-
if (in != null) {
-
in.close();
-
}
-
if (out != null) {
-
out.close();
-
}
-
} catch (IOException ioe) {
-
}
-
}
-
}
-
-
public static void download(String address) {
-
int lastSlashIndex = address.lastIndexOf(‘/’);
-
if (lastSlashIndex >= 0 &&
-
lastSlashIndex < address.length() - 1) {
-
download(address, address.substring(lastSlashIndex + 1));
-
} else {
-
System.err.println(“Could not figure out local file name for “ +
-
address);
-
}
-
}
-
//*****************************************************************
-
public static String zmiana_adresu(String url) {
-
String address; //Adres,ktory wczytujemy(http://www.wrzuta.pl/audio/6HeShIhpgL/fenomen-powiedz )
-
String adres_new; //Adres,ktory chcemy otrzymac(http://www.wrzuta.pl/aud/file/6HeShIhpgL/1)
-
String skladowe[];
-
int x,dlugosc;
-
int y = 0;
-
String bufor, rodzaj;
-
for(x = 1; x<=address.length(); ++x)
-
{
-
if ( address[x]==‘/’){
-
skladowe[y]=bufor;
-
bufor = “”;
-
y++;
-
} else {
-
bufor +=address[x];
-
}
-
skladowe[y]=bufor;
-
if (skladowe[3]==“film”) rodzaj=“/vid”;
-
if (skladowe[3]== “audio”) rodzaj=“/aud”;
-
adres_new=“http://”+skladowe[2]+rodzaj+“/file/”+skladowe[4]+“/1″ ;
-
return address;
-
}
-
}
-
//*****************************************************************
-
-
public static void main(String[] args) {
-
for (int i = 0; i < args.length; i++) {
-
download( zmiana_adresu(args[i]) );
-
}
-
}
-
-
}