I just tested it, and accidentally caused a "block", and lost a file while doing so.
With FormPost(), the filename is opened for reading: ie:
TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);
With Put, LocalFileName is actually the response, not a file to be sent. ie:
F:=TFileStream.Create(LocalFileName,fmCreate);
Which is kinda odd to me. Indy has:
procedure Put(AURL: string; ASource, AResponseContent: TStream); overload;
Which is what I thought a PUT was.
Anyway, it looks like fphttpclient doesn't have a working PUT. As for your block. I selected a file that was locked by Lazarus, and I got a block, until I closed Lazarus, and bingo, my file was cleared.
I think you need to use Indy or Synapse if you want a PUT.