感谢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的热心和贡献!!!
#换@
谢谢了!
成功了!为我们的汉语,为了我们的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的热心和贡献!!!
这种解决方法非常好,可以不用动原来的IDE系统自带单元文件。
uses处要引用三个单元
IdMultipartFormData,IdGlobal,IdStream
这两个地方,方法没有引用.请问是怎么回事.谢谢LItem.FormatField
LItem.PrepareDataStream