2012-12-11 4 views
0

Je suis intéressant d'envoyer un fichier et son nom de fichier. les options de serveur:
Erlang: envoyer le fichier et le nom de fichier

-define(TCP_OPTIONS_SERVER, [binary, {packet, 0}, {active, false}]). 

C'est la boucle du récepteur:

file_receiver_loop(Socket,Bs)-> 
case gen_tcp:recv(Socket, 0) of 
    {ok, B} -> 
     file_receiver_loop(Socket, [Bs, B]); 
    {error, closed} -> 
     io:format("~nReceived!~n ~p",[Bs]), 
     save_file(Bs) 
end. 

J'envoyer le fichier avec:

file:sendfile(FilePath, Socket), 

Lorsque j'envoie le fichier et le nom

gen_tcp:send(Socket,Filename), 
file:sendfile(FilePath, Socket), 

Les données binaires ont une structure variable.

Merci à tous!

Répondre

0

Je crée ce code pour résoudre le problème.
J'envoie 30 octets pour le nom de fichier.
Si le nom de fichier < 30 j'utilise le remplissage avec le caractère blanc.
Lorsque la connexion est acceptée j'appelle la fonction file_name_receiver (Socket), qui reçoivent le nom du fichier:

file_name_receiver(Socket)-> 
    {ok,FilenameBinaryPadding}=gen_tcp:recv(Socket,30), 
    FilenamePadding=erlang:binary_to_list(FilenameBinaryPadding), 
    Filename = string:strip(FilenamePadding,both,$), 
    file_receiver_loop(Socket,Filename,[]). 

Cette fonction riceive le fichier de données binaires:

file_receiver_loop(Socket,Filename,Bs)-> 
    io:format("~nRicezione file in corso~n"), 
    case gen_tcp:recv(Socket, 0) of 
    {ok, B} -> 
     file_receiver_loop(Socket, Filename,[Bs, B]); 
    {error, closed} -> 
     save_file(Filename,Bs) 
end. 

Enfin, cette fonction enregistrer le fichier.

%%salva il file 
save_file(Filename,Bs) -> 
    io:format("~nFilename: ~p",[Filename]), 
    {ok, Fd} = file:open("../script/"++Filename, write), 
    file:write(Fd, Bs), 
    file:close(Fd). 

L'expéditeur utilise une fonction simple:

%%Permette l'invio di un file specificando host,filename e path assoluto 
send_file(Host,Filename,FilePath,Port)-> 
    {ok, Socket} = gen_tcp:connect(list_to_atom(Hostname), Port,   TCP_OPTIONS_CLIENT), 
    FilenamePadding = string:left(Filename, 30, $), %%Padding with white space 
    gen_tcp:send(Socket,FilenamePadding), 
    Ret=file:sendfile(FilePath, Socket), 
    ok = gen_tcp:close(Socket). 
Questions connexes