本帖最后由 lhdebbs 于 2011-11-24 09:50:09 编辑

解决方案 »

  1.   

    重载的话,就是自己从TIdMultiPartFormDataStream派生出一个子类,覆写它的方法。。
      

  2.   

    delphiphp#126.com
    #换@
    谢谢了!
      

  3.   

    感谢LoveMit网友!
    成功了!为我们的汉语,为了我们的delphi 2010详细说一下怎么修正:1.在当前单元的type部分加入TEncodingMultiPartFormData = class(TIdMultiPartFormDataStream)
      protected
        function IdRead(var VBuffer: TIdBytes; AOffset, ACount: Longint): Longint; override;
      end;TEncodingMultiPartFormData目的是扩展TIdMultiPartFormDataStream类,并重写IdRead方法。
    2.在implementation部分加入{ TEncodingMultiPartFormData }function TEncodingMultiPartFormData.IdRead(var VBuffer: TIdBytes; AOffset,
      ACount: Integer): Longint;
    var
      LTotalRead: Integer;
      LCount: Integer;
      LBufferCount: Integer;
      LRemaining : Integer;
      LItem: TIdFormDataField;
    begin
      if not FInitialized then begin
        FInitialized := True;
        FCurrentItem := 0;
        SetLength(FInternalBuffer, 0);
      end;  LTotalRead := 0;
      LBufferCount := 0;  while (LTotalRead < ACount) and ((FCurrentItem < FFields.Count) or (Length(FInternalBuffer) > 0)) do begin
        if (Length(FInternalBuffer) = 0) and not Assigned(FInputStream) then begin
          LItem := FFields.Items[FCurrentItem];
          AppendString(FInternalBuffer, LItem.FormatField,  -1, TEncoding.Default);      if Assigned(LItem.FieldObject) then begin
            if (LItem.FieldObject is TStream) then begin
              FInputStream := TStream(LItem.FieldObject);
              FInputStream.Position := 0;
            end else begin
              if (LItem.FieldObject is TStrings) then begin
                AppendString(FInternalBuffer, TStrings(LItem.FieldObject).Text,  -1, TEncoding.Default);
                Inc(FCurrentItem);
              end;
            end;
          end else begin
            Inc(FCurrentItem);
          end;
        end;    if Length(FInternalBuffer) > 0 then begin
          if Length(FInternalBuffer) > (ACount - LBufferCount) then begin
            LCount := ACount - LBufferCount;
          end else begin
            LCount := Length(FInternalBuffer);
          end;      if LCount > 0 then begin
            LRemaining := Length(FInternalBuffer) - LCount;
            CopyTIdBytes(FInternalBuffer, 0, VBuffer, LBufferCount, LCount);
            if LRemaining > 0 then begin
              CopyTIdBytes(FInternalBuffer, LCount, FInternalBuffer, 0, LRemaining);
            end;
            SetLength(FInternalBuffer, LRemaining);
            LBufferCount := LBufferCount + LCount;
            FPosition := FPosition + LCount;
            LTotalRead := LTotalRead + LCount;
          end;
        end;    if Assigned(FInputStream) and (LTotalRead < ACount) then begin
          LCount := TIdStreamHelper.ReadBytes(FInputStream,VBuffer, ACount - LTotalRead, LBufferCount);
          if LCount < (ACount - LTotalRead) then begin
            FInputStream.Position := 0;
            FInputStream := nil;
            Inc(FCurrentItem);
            SetLength(FInternalBuffer, 0);
            AppendString(FInternalBuffer, #13#10, -1, TEncoding.Default);
          end;      LBufferCount := LBufferCount + LCount;
          LTotalRead := LTotalRead + LCount;
          FPosition := FPosition + LCount;
        end;    if FCurrentItem = FFields.Count then begin
          AppendString(FInternalBuffer, PrepareStreamForDispatch,  -1, TEncoding.Default);
          Inc(FCurrentItem);
        end;
      end;
      Result := LTotalRead;
    end;这部分是新IdRead的实现。
    3.在你需要用的地方建立TEncodingMultiPartFormData的对象,使用方式和原来的TIdMultiPartFormDataStream一致;var
      Stream:TStringStream;
      Multi:TEncodingMultiPartFormData;
    begin
      Stream :=TStringStream.Create('', TEncoding.Default);
      Multi :=TEncodingMultiPartFormData.Create;
      Multi.AddFormField('FIELD_Title','你好');
      Multi.AddFormField('FIELD_Content','你好:Nice to meet you!');
      Stream.LoadFromStream(Multi);
      Stream.SaveToFile(ExtractFilePath(Application.ExeName)+'2.txt');
      FreeAndNil(Stream);
      FreeAndNil(Multi);
    end;Stream :=TStringStream.Create('', TEncoding.Default);
    如果还有问题,TEncoding.Default可以试试不同的值,TEncoding.Unicode;TEncoding.UTF8;等再次特别感觉LoveMit的热心和贡献!!!
      

  4.   

    TEncodingMultiPartFormData目的是扩展TIdMultiPartFormDataStream类,并重写IdRead方法。
    这种解决方法非常好,可以不用动原来的IDE系统自带单元文件。
      

  5.   

    另外补充:
    uses处要引用三个单元
    IdMultipartFormData,IdGlobal,IdStream
      

  6.   

    AppendString(FInternalBuffer, LItem.FormatField,  -1, TEncoding.Default);      FInputStream := LItem.PrepareDataStream(FFreeInputStream);
    这两个地方,方法没有引用.请问是怎么回事.谢谢LItem.FormatField
     LItem.PrepareDataStream
      

  7.   

    这个方法是可以传过去字段是中文,但是上传图片就不行了,addfile后总是提示图片格式不正确