Jak wyslac plik metoda http post przez delphi

0

Witam
Mam pytanie i zarazem prosbe o pomoc przy takim zagadnieniu:

Chce zrobic procedure ktora dzieki metodzie HTTP wysle plik do skryptu php dzieki ktoremu plik trafi na serwer.
Skrypt php jest gotowy i sprawny ( zreszta takie skrypty mozna bez problemu znaleŹĆ w sieci dlatego nie podaje go tutaj )

wiadomosc:="Wyslano plik o nazwie moj_dokument.doc rozmiar tego pliku to: "
plik:="moj_dokument.doc"

Zadaniem procedury jest wyslac plik
czy ktos wie cos na ten temat /? ( uprzedzam Od razu czytalem forum szukalem na google )
Z gory dziekuje za pomoc

0

Bidne to twoje szukanie :P

dla "protokół http post" wujek google wyłuskał:

http://tools.ietf.org/html/rfc2616#page-54 - RFC tam masz wszystko, ale po angielsku ;)
http://teleinfo.pb.bialystok.pl/~krashan/instrukcje/pas-pracownia-4.pdf - fajny pdf'ik, nawet z przykładem tego co chcesz.

0

Warto czytac dokladnie pytanie zanim sie co kolwiek napisze:-)
Mimo to dzieki za info.

To co podales to jak stworzyc kod w php to mnie nie interesuje bo to mam
Chodzi o procedure w DELPHI 7 na obsluge HTTP z metoda post z wysylaniem pliku
mam widzialem na forum metode wysylania tekstu ale bez pliku jak dodac do tego plik ?

0

HTTP

0

hmm dzieki ale skad pobrac ten plik ? http.dll skoro te linki nie dzialaja ?
zatem i procedura dzialac nie bedzie ech...

0

I ktoś tu wspominał o dokładnym czytaniu przed pisaniem :P

Nie ma tam nic o php, tylko format nagłówka i danych jakie trzeba wysłać do serwera.
Ostatecznie twoja procedurka powinna działać tak:

1 - łączysz się przez TCP z serwerem na porcie na jakim nasłuchuje
2 - na soket wrzucasz nagłówek (pdf), pustą linię i plik (pdf)
3 - zamykasz połączenie

i jeśli twój skrypt działa to masz na serwerze pliczek ;)

0

Hmm mowisz o naglowkach mogbys zatem przytoczyc przyklad skoro wg Ciebie to takie proste?
Mysle ze wielu uzytkownikow tego forum by bylo zadowolonych z tego jak by wrescie ktos z uczynnych i naprawde chcacych pomoc osob przytoczyl taki przyklad dzialania wysylania pliku przez delphi poslugujac sie metoda http post

0

Moze to w czyms pomoze ? ( jesli ktos ma lepsze niech zapoda i zamknijmy temat raz na zawsze )

uses ms;

procedure costam;

var
ResponseStream: TStringStream;
MultiPartFormDataStream: TMsMultiPartFormDataStream;

begin
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
ResponseStream := TStringStream.Create('');

try

Http.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('upfile_0yh23',plik,'application/zip');
MultiPartFormDataStream.AddFormField('category','1');

//-------- LISTA KATEGORII -----------------------
for i := 0 to Form1.ComponentCount-1 do
begin
if Form1.Components[i] is TCheckBox then
begin
if TCheckBox(Form1.Components[i]).Checked then
begin
nazwa := TCheckBox(Form1.Components[i]).Name;
Delete(nazwa,1,1);
MultiPartFormDataStream.AddFormField('category',nazwa);
end;
end;
end;
//--------------------------------------------------

MultiPartFormDataStream.AddFormField('textarea',Opis_plik.lines.text);
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
 http.Post(ADRES_STRONY',MultiPartFormDataStream,ResponseStream);

finally
html := ResponseStream.DataString;
MultiPartFormDataStream.Free;
ResponseStream.Free;

end;

Potwierdz.OnClick(sender);

end;

unit ms to sposób na wysyłanie plików do skryptu http://www.mm.pl/~sl4sh/ms.txt
zawartosc pliku ms.txt pod spodem na wypadek jak by link przestal dzialac

unit MsMultiPartFormData;

interface

uses
SysUtils, Classes;

const
CONTENT_TYPE = 'multipart/form-data; boundary=';
CRLF = #13#10;
CONTENT_DISPOSITION = 'Content-Disposition: form-data; name="%s"';
FILE_NAME_PLACE_HOLDER = '; filename="%s"';
CONTENT_TYPE_PLACE_HOLDER = 'Content-Type: %s' + crlf + crlf;
CONTENT_LENGTH = 'Content-Length: %d' + crlf;

type
TMsMultiPartFormDataStream = class(TMemoryStream)
private
FBoundary: string;
FRequestContentType: string;
FInitial: Boolean;
function GenerateUniqueBoundary: string;
public
procedure AddFormField(const FieldName, FieldValue: string);
procedure AddFile(const FieldName, FileName, ContentType: string; FileData: TStream); overload;
procedure AddFile(const FieldName, FileName, ContentType: string); overload;
procedure PrepareStreamForDispatch;
constructor Create;
property Boundary: string read FBoundary;
property RequestContentType: string read FRequestContentType;
end;

implementation

{ TMsMultiPartFormDataStream }

constructor TMsMultiPartFormDataStream.Create;
begin
inherited;
FInitial := True;
FBoundary := GenerateUniqueBoundary;
FRequestContentType := CONTENT_TYPE + FBoundary;
end;

procedure TMsMultiPartFormDataStream.AddFile(const FieldName, FileName,
ContentType: string; FileData: TStream);
var
sFormFieldInfo: string;
Buffer: PChar;
iSize: Int64;
begin
iSize := FileData.Size;
// Malikyar -- Removed the Content_length parameter since the web buffer did not contain it.
{
sFormFieldInfo := Format(CRLF + '--' + Boundary + CRLF + CONTENT_DISPOSITION +
FILE_NAME_PLACE_HOLDER + CRLF + CONTENT_LENGTH +
CONTENT_TYPE_PLACE_HOLDER, [FieldName, FileName, iSize, ContentType]);
}
sFormFieldInfo := Format(CRLF + '--' + Boundary + CRLF + CONTENT_DISPOSITION +
FILE_NAME_PLACE_HOLDER + CRLF +
CONTENT_TYPE_PLACE_HOLDER, [FieldName, FileName, ContentType]);

Write(Pointer(sFormFieldInfo)^, Length(sFormFieldInfo));
FileData.Position := 0;
GetMem(Buffer, iSize);
try
FileData.Read(Buffer^, iSize);
Write(Buffer^, iSize);
finally
FreeMem(Buffer, iSize);
end;
end;

procedure TMsMultiPartFormDataStream.AddFile(const FieldName, FileName,
ContentType: string);
var
FileStream: TFileStream;
begin
FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
AddFile(FieldName, FileName, ContentType, FileStream);
finally
FileStream.Free;
end;
end;

procedure TMsMultiPartFormDataStream.AddFormField(const FieldName,
FieldValue: string);
var
sFormFieldInfo: string;
begin
// Add a check to see if it's the initial field being added. If so, then do not preface with a CRLF.
if FInitial then
begin
sFormFieldInfo :=
Format('--' + Boundary + CRLF + CONTENT_DISPOSITION + CRLF + CRLF +
FieldValue, [FieldName]);
FInitial := False;
end
else
sFormFieldInfo :=
Format(CRLF + '--' + Boundary + CRLF + CONTENT_DISPOSITION + CRLF + CRLF +
FieldValue, [FieldName]);
Write(Pointer(sFormFieldInfo)^, Length(sFormFieldInfo));
end;

function TMsMultiPartFormDataStream.GenerateUniqueBoundary: string;
begin
Result := '---------------------------' + FormatDateTime('mmddyyhhnnsszzz', Now);
end;

procedure TMsMultiPartFormDataStream.PrepareStreamForDispatch;
var
sFormFieldInfo: string;
begin
sFormFieldInfo := CRLF + '--' + Boundary + '--' + CRLF;
Write(Pointer(sFormFieldInfo)^, Length(sFormFieldInfo));
Position := 0;
FInitial := True;
end;

end.

w OnWork w TidHTTP dać

if AWorkMode = wmWrite then //wmWrite - czyli wysyłanie
postep.Position := AWorkCount; //postep - progress bar

przy otwieraniu pliku pobrać jego rozmiar i ustawić jako wartość MAX dla progress bar'a

http://4programmers.net/Forum/405968?h=http%20post#id405968

1 użytkowników online, w tym zalogowanych: 0, gości: 1