2012-05-26 17 views
12

के साथ एचटीपी पोस्ट मेरे पास मेरे वेब सर्वर पर एक साधारण PHP स्क्रिप्ट है जिसे मुझे HTTP POST का उपयोग करके एक फ़ाइल अपलोड करने की आवश्यकता है, जिसे मैं डेल्फी में कर रहा हूं।इंडी

इंडी के साथ मेरा कोड यहां है लेकिन गारंटी है कि यह काम नहीं करेगा और मैं यह नहीं समझ सकता कि मैं ठीक से क्या नहीं कर रहा हूं। मैं सर्वर पर जो भेजता हूं उसे देख सकता हूं क्या ऐसा उपकरण है?

procedure TForm1.btn1Click(Sender: TObject); 
var 
    fname : string; 
    MS,dump : TMemoryStream; 
    http : TIdHTTP; 

const 
    CRLF = #13#10; 
begin 
    if PromptForFileName(fname,'','','','',false) then 
    begin 
    MS := TMemoryStream.Create(); 
    MS.LoadFromFile(fname); 
    dump := TMemoryStream.Create(); 
    http := TIdHTTP.Create(); 
    http.Request.ContentType:='multipart/form-data;boundary =-----------------------------7cf87224d2020a'; 
    fname := CRLF + '-----------------------------7cf87224d2020a' + CRLF + 'Content-Disposition: form-data; name=\"uploadedfile\";filename=\"test.png"' + CRLF; 
    dump.Write(fname[1],Length(fname)); 
    dump.Write(MS.Memory^,MS.Size); 
    fname := CRLF + '-----------------------------7cf87224d2020a--' + CRLF; 
    dump.Write(fname[1],Length(fname)); 
    ShowMessage(IntToStr(dump.Size)); 
    MS.Clear; 
    try 
    http.Request.Method := 'POST'; 
    http.Post('http://posttestserver.com/post.php',dump,MS); 
    ShowMessage(PAnsiChar(MS.Memory)); 
    ShowMessage(IntToStr(http.ResponseCode)); 
    except 
    ShowMessage('Could not bind socket'); 
    end; 
    end; 
end; 
+2

"यह काम नहीं करता है" कम से कम उपयोगी वाक्यांश संभव है जब कुछ डीबग करना संभव हो। क्या काम नहीं करता है? यह गलत क्या करता है? –

+0

@MasonWheeler अगर मुझे जवाब पता था तो शायद मैं इस सवाल नहीं पूछ रहा था। यह वेबसर्वर पर अपलोड नहीं होता है, जो मुझे लगता है कि पोस्ट हेडर खराब है लेकिन मुझे नहीं पता कि मैं क्या गलत कर रहा हूं। – opc0de

+0

एमएस क्लीयर क्यों है; http.Post (यूआरएल, एमएस) से पहले बुलाया जाता है? – ComputerSaysNo

उत्तर

18

इंडी इस उद्देश्य के लिए TIdMultipartFormDataStream है:

procedure TForm1.SendPostData; 
var 
    Stream: TStringStream; 
    Params: TIdMultipartFormDataStream; 
begin 
    Stream := TStringStream.Create(''); 
    try 
    Params := TIdMultipartFormDataStream.Create; 
    try 
    Params.AddFile('File1', 'C:\test.txt','application/octet-stream'); 
    try 
    HTTP.Post('http://posttestserver.com/post.php', Params, Stream); 
    except 
    on E: Exception do 
     ShowMessage('Error encountered during POST: ' + E.Message); 
    end; 
    ShowMessage(Stream.DataString); 
    finally 
    Params.Free; 
    end; 
    finally 
    Stream.Free; 
    end; 
end; 
+0

यह काम करता है लेकिन मैं जानना चाहता हूं कि मैं अपने कोड में क्या गलत कर रहा था ... – opc0de

+1

वायरशर्क का उपयोग करें और अपने कोड और इंडी द्वारा उत्पादित हेडर की तुलना करें ?? – whosrdaddy

+0

यह निश्चित रूप से स्पष्ट है कि 'TIdMultipartFormDataStream' एक फ़ाइल घटक अपलोड है जिसे मैं देख रहा हूं कि मुझे यह कैसे याद आया? :) –

2

इंडी से एक PHP कॉलिंग उपयोगकर्ता-एजेंट की वजह से असफल हो सकता है, तो आप 403 त्रुटि मिलती है।

यह मेरे लिए यह तय हो गई इस तरह की कोशिश करो,:

var Answer: string; 
begin 
    GetHTML:= TIdHTTP.create(Nil); 
    try 
    GetHTML.Request.UserAgent:= 'Mozilla/3.0'; 
    Answer:= GetHTML.Get('http://www.testserver.com/test.php?id=1'); 
    finally 
    GetHTML.Free; 
    end; 
end; 
0

आप 2 वर्ण खो दिया '-'। ऐसा करना बेहतर है:

http.Request.ContentType:='multipart/form-data;boundary='+myBoundery; 
fname := CRLF + '--' + myBoundery + CRLF + 'Content-Disposition: form-data; name=\"uploadedfile\";filename=\"test.png"' + CRLF; 
संबंधित मुद्दे