2012-12-11 9 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 바이트를 보냅니다.
파일 이름이 < 인 경우 흰색 글씨로 채우기를 사용합니다.

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. 

마지막으로,이 기능은 파일을 저장할 파일 이름을받는 연결이 나는 기능 file_name_receiver (소켓)를 호출 수락
.

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

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

발신자 간단한 함수를 사용