2012-12-11 38 views
0

我很有興趣發送一個文件,它的文件名。 服務器的選項:
Erlang:發送文件和文件名

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

這就是接收線圈:

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. 

我送文件用:

file:sendfile(FilePath, Socket), 

當我發送的文件和文件名

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

二進制數據具有可變結構。

謝謝大家!

回答

0

我使這個代碼來解決這個問題。
我發送了30個字節的文件名。
如果文件名爲< 30我用填充白色字符。
當連接被接受我調用函數file_name_receiver(插座),接收的文件名:

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,[]). 

此功能riceive二進制數據文件:

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. 

最後,這一功能保存文件。

%%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). 

發件人使用一個簡單的功能:

%%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).