2011-05-31 44 views
6

Tôi đang cố gắng tải tệp lên máy chủ TIdHTTPS Indy (ver. 10.5.5).
Tôi đã tìm kiếm các giải pháp nhưng không có may mắn cho đến nay, những gì tôi đã tìm thấy cho các phiên bản cũ hơn của Indy không tương thích với phiên bản được chuyển với Delphi 2010.TIdHTTPServer tải lên tệp

Điều tôi hy vọng là đạt được chỉ cần tải lên một tệp bằng cách sử dụng "multipart/form-data" cho máy chủ và giải mã nó, đơn giản như vậy, mọi trợ giúp đều được đánh giá cao.

+1

Đối với phần giải mã MIME, Indy chứa một lớp 'TIdDecoderMIME' trong đơn vị' Giao thức \ IdCoderMIME' – mjn

+0

có, nhưng nó không xử lý dữ liệu như tôi cần đến ... tiếc là bình luận của bạn – ComputerSaysNo

+1

10.5 .5 không phải là rất cũ, nhưng tôi muốn thử Indy 10.5 hiện tại.8 phiên bản – mjn

Trả lời

4

Tôi bắt đầu xxm như một cách để xây dựng trang web với Delphi và có các tập lệnh có cả mã HTML và mã Pascal được biên dịch lại bằng một lần nhấn nút làm mới của trình duyệt sau khi thực hiện thay đổi.

Nó sử dụng giao diện chung mà 'cắm vào' IIS, Apache, Internet Explorer, FireFox và có cả một HTTP exe độc ​​lập. Giao diện hiển thị IxxmParameterPostFile trên tham số khi tệp được tải lên.

Xem demo 4 Upload để biết ví dụ.

+1

nó không thực sự trên câu hỏi nhưng khá nhiều về tại chỗ, dự án rất đẹp, tôi không thể tin rằng tôi đã không nhìn thấy nó trước đây.Bất kỳ cơ hội nó sẽ được chuyển đến "Pascal miễn phí" để hỗ trợ nền tảng chéo? Tôi không có đủ thời gian để "chơi" vào lúc này , nhưng tôi chắc chắn sẽ cung cấp cho XXM sự chú ý nhiều hơn trong vài tuần tới – ComputerSaysNo

+1

Chuyển đến bản lề FreePascal trên một ComServ.pas phong phú, đã bị mất mỗi lần kiểm tra cuối cùng tôi đã có một lỗi khi tạo một ComServ nguồn mở. pas, _if_ Tôi có tất cả thời gian và tiền bạc của thế giới ... –

+0

Tôi cảm thấy bạn Stijn, thậm chí tho 'Tôi không thể chuyển sang XXM ngay bây giờ, nó là lựa chọn gần nhất cho câu hỏi của tôi, cảm ơn bạn! – ComputerSaysNo

3

Only suitable solution I can find mà không đích thân kiểm tra (cho tôi biết nếu điều này không dẫn bạn đến một giải pháp làm việc cho các nhu cầu của bạn, và tôi sẽ cháy lên XE và sản xuất cái gì hùng hồn hơn)

+0

chỉ là một FYI, phần tích cực trong số đó là tạo một TStream (TFileStream hoặc TMemoryStream), sau đó gọi IdHTTP1.Post (, ); – LaKraven

+0

nó không chính xác những gì tôi cần, xem vấn đề là dữ liệu được gửi bởi trình duyệt cũng cần phải được giải mã từ MIME sang nhị phân. – ComputerSaysNo

+0

ah ... có thể đáng để điều chỉnh câu hỏi của bạn để làm rõ yêu cầu đó :) – LaKraven

8

TIdHTTPServer hiện không hỗ trợ multipart/form-data đệ trình nguyên bản. Đó là trên danh sách việc cần làm cho Indy 11. Trong thời gian chờ đợi, bạn phải phân tích cú pháp dữ liệu MIME đã đăng theo cách thủ công bằng cách sử dụng TIdDecoderMIME, như mjn đã đề xuất. Đã có những ví dụ được đăng trong diễn đàn Embarcadero và Indy trước đây.

+1

Hi Remy, tôi đã cố gắng tìm ra điều đó ... các trình diễn có sẵn không phân tích cú pháp dữ liệu chính xác, nó để lại ranh giới cuối trong tệp ... dưới dạng giải pháp tạm thời trong sự kiện "OnCreatePostStream" của Tôi chỉ đơn giản là tạo ra một dòng tập tin và trên sự kiện "OnCommandGet" tôi chỉ cần bỏ qua ranh giới và sao chép dữ liệu chính xác trong "dòng tập tin cuối cùng" và nó có vẻ là làm việc như tôi cần ít nhất cho thời điểm này ... – ComputerSaysNo

+0

Nếu một ranh giới đang bị bỏ lại phía sau, sau đó bạn không xử lý dữ liệu một cách chính xác. Bạn đang xem chính xác những bản demo nào? –

+0

http://forums2.atozed.com/viewtopic.php?f=7&t=23732 bài đăng thứ hai là của bạn tôi tin (gambit47?), McptEOF không tồn tại trong Indy 10.5.5, nhưng tôi vẫn cố tải lên, đôi khi (khi các tệp lớn được tải lên, hàng trăm megabyte ZIP hoặc RAR tệp) đã bị xóa, trong các trường hợp khác như ranh giới của PDF còn lại, tôi tin rằng nó có liên quan đến CR, LF, CRLF tại một số thời điểm khi đọc nội dung luồng. Hiện tại, "OnCreatePostStream" tôi tạo một luồng tệp và "OnCommandGet" tôi sử dụng ReadLnFromStream để bỏ qua 4 dòng đầu tiên (thông tin về biên giới và tệp) và đọc cho đến khi ... – ComputerSaysNo

1

http://www.synaptica.info/2014/01/31/tidhttpserver-decode-content-type-multipartform-data/

tôi làm một upload đơn giản nhiều phần dữ liệu như thế này:

đơn vị sử dụng:

interface 
uses 
    System.SysUtils, System.Classes, Web.Win.Sockets, IdBaseComponent, 
    IdComponent, IdCustomTCPServer, IdCustomHTTPServer, IdHTTPServer, IdContext, 
    IdTCPServer,System.Generics.Collections, Data.DB, Datasnap.DBClient,IdHeaderList,idGlobal, 
    IdIntercept,IdMessage,IdMessageCoderMIME,IdMessageCoder,IdGlobalProtocols; 

mã mà vòng lặp về nội dung kịch câm:

procedure TdmNet.IdHTTPServerCommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
Var 
    ms : TMemoryStream; 
    newdecoder, Decoder: TIdMessageDecoder; 
    boundary, startboundary : String; 
    msgEnd : Boolean; 
    tmp : String; 
    I : Integer; 
    fname : String; 
    tsValues : TStringList; 

begin 
    i := 0; 


    if pos('upload',lowercase(ARequestInfo.Document)) > 0 then 
    begin 
    If ARequestInfo.PostStream = nil then 

     AResponseInfo.ContentText := '<HTML><BODY>unparsed:' + ARequestInfo.UnparsedParams + 
     '<br>Encoding:' + ARequestInfo.ContentEncoding + ARequestInfo.RawHeaders.Values['Content-Type'] + 
     '<br>HashCode:' + IntToStr(ARequestInfo.GetHashCode) + 
     '<br>Params:' + ARequestInfo.Params.Text + ' -->stream nullo<br></BODY><HTML>' 
    Else 
     ARequestInfo.PostStream.Position := 0; 
     msgEnd := False; 


     boundary := ExtractHeaderSubItem(ARequestInfo.ContentType, 'boundary',QuoteHTTP); 
     startboundary := '--' + boundary; 
     repeat 
     tmp := ReadLnFromStream(ARequestInfo.PostStream, -1, True); 
     until tmp = startboundary; 

     decoder := TIdMessageDecoderMIME.Create(nil); 
     TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary; 
     tsValues := TStringList.Create; 

     try 
      repeat 
      decoder.SourceStream := ARequestInfo.PostStream; 
      decoder.FreeSourceStream := false; 
      decoder.ReadHeader; 
      inc(I); 
      case Decoder.PartType of 
      mcptAttachment,mcptText : begin 

           ms := TMemoryStream.Create; 
           ms.Position := 0; 
           newdecoder := Decoder.ReadBody(ms,msgEnd); 
           tmp := Decoder.Headers.Text; 
           fname := decoder.Filename; 
           decoder.Free; 
           decoder := newdecoder; 
           if decoder <> nil then 
           TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary; 
           sleep(100); 
           if fname <> '' then 
           begin 
           ms.SaveToFile(fname); 

           //msgEnd := true; 
           end 
           else 
           begin 
           ms.SaveToFile(inttostr(i) + '.txt'); 
           end; 
           ms.Free; 
          end; 
      mcptIgnore: Begin 
         try 
          FreeAndNil(decoder); 
          decoder := TIdMessageDecoderMIME.Create(nil); 
          TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary; 
         finally 
          ms.Free; 
         end; 
         End; 
      mcptEOF: begin FreeAndNil(decoder); msgEnd := True end; 
      end; 

      until (decoder = nil) or(msgEnd); 
     finally 
     if decoder <> nil then 
     decoder.Free; 

     end; 


     AResponseInfo.ContentText := AResponseInfo.ContentText + '</BODY><HTML>'; 

     AResponseInfo.ContentText := '<HTML><BODY>unparsed:' + ARequestInfo.UnparsedParams + 
     '<br>Encoding:' + ARequestInfo.ContentEncoding + '<br>Conte' + ARequestInfo.RawHeaders.Values['Content-Type'] + 
     '<br>HashCode:' + IntToStr(ARequestInfo.GetHashCode) + 
     '<br>Params:' + ARequestInfo.Params.Text + ' -->stream nullo<br></BODY><HTML>'; 
    end 
    Else 
    Begin 
    AResponseInfo.ContentText := 
    '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ' + #10#13 + 
    '<html xmlns="http://www.w3.org/1999/xhtml">                     ' + #10#13 + 
    '<head>                              ' + #10#13 + 
    '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />              ' + #10#13 + 
    '<title>Pagina di prova</title>                        ' + #10#13 + 
    '</head>                              ' + #10#13 + 
    '                               ' + #10#13 + 
    '<body>                              ' + #10#13 + 
    '<h1>Test multipart from <a href="www.synaptica.info">Synaptica Srl</a> </h1> <BR><BR>              ' + #10#13 + 
    '<form action="upload" method="post" enctype="multipart/form-data">                        ' + #10#13 + 
    '<p>key                              ' + #10#13 + 
    ' <input type="text" name="key" id="key" />                     ' + #10#13 + 
    '</p>                              ' + #10#13 + 
    '<p>group                              ' + #10#13 + 
    ' <input type="text" name="group" id="key" />                     ' + #10#13 + 
    '</p>                              ' + #10#13 + 
    '                               ' + #10#13 + 
    '<label for="file">Filename:</label>                       ' + #10#13 + 
    '<label for="file">' + ARequestInfo.Document + '</label>                       ' + #10#13 + 
    '<input type="file" name="file" id="file" />                     ' + #10#13 + 
    '<br />                              ' + #10#13 + 
    '<input type="submit" name="submit" value="Submit" />                  ' + #10#13 + 
    '</form></p>                             ' + #10#13 + 
    '</body>                              ' + #10#13 + 
    '</html>                              '; 
    End; 
1

Dường như với tôi rằng đây là một vấn đề lâu năm. Tôi đã xem xét tất cả các loại đề xuất trên internet và không có gì so sánh được với MsMultipartparser.pas khi đề nghị. Đáng buồn thay, nó không hoạt động với Unicode.

Tại sao một người nào đó thông minh hơn tôi viết lại MsMultipartparser.pas và tiết kiệm cho chúng tôi rất nhiều rắc rối?

Indy - không hoạt động.

IPWorks - dường như chỉ cung cấp cho bạn tên tệp và v.v. Không thể tìm ra cách tự lấy tập tin.

Alcinoe - không có hướng dẫn cài đặt chứ chưa nói lời giải thích và dường như không làm việc cho XE8 hoặc Delphi 10

Tôi nhìn một số người khác nhưng họ đều là không thực tế.