Decodetostostream في Indy10.
سؤال
أريد ترقية طلبي من Indy 9 إلى 10 مع دلفي 2007. الآن هذا لا يترجم بعد الآن كما لم يتم العثور على Decodetostream. يستخدم الرمز Gold Framwork حيث يوجد إشارة إلى Boldelement.
أي طرق بديلة للاتصال؟
تحديث (أعتقد أنني تبسيط المثال السابق كثيرا)
الرمز الأصلي:
BlobStreamStr : String;
MIMEDecoder : TidDecoderMIME;
if (BoldElement is TBATypedBlob) then
begin
BlobStreamStr := copy(ChangeValue,pos(']',ChangeValue)+1,maxint);
(BoldElement as TBATypedBlob).ContentType := copy(ChangeValue,2,pos(']',ChangeValue)-2);
MIMEDecoder := TidDecoderMIME.Create(nil);
try
MIMEDecoder.DecodeToStream(BlobStreamStr,(BoldElement as TBATypedBlob).CreateBlobStream(bmWrite));
finally
FreeAndNil(MIMEDecoder);
end;
end
بعد تغييري:
BlobStreamStr : String;
MIMEDecoder : TidDecoderMIME;
LStream : TIdMemoryStream;
if (BoldElement is TBATypedBlob) then
begin
BlobStreamStr := copy(ChangeValue, pos(']', ChangeValue) + 1, maxint);
(BoldElement as TBATypedBlob).ContentType := copy(ChangeValue, 2, pos(']',ChangeValue)-2);
MIMEDecoder := TidDecoderMIME.Create(nil);
LStream := TIdMemoryStream.Create;
try
MIMEDecoder.DecodeBegin(LStream);
MIMEDecoder.Decode(BlobStreamStr, 0, Length(BlobStreamStr));
LStream.Position := 0;
ReadTIdBytesFromStream(LStream, DecodedBytes, Length(BlobStreamStr));
// Should memory for this stream be released ??
(BoldElement as TBATypedBlob).CreateBlobStream(bmWrite).Write(DecodedBytes[0], Length(DecodedBytes));
finally
MIMEDecoder.DecodeEnd;
FreeAndNil(LStream);
FreeAndNil(MIMEDecoder);
end;
end
لكنني لست واثقا من كل تغييراتي لأنني لا أعرف أندي كثيرا. لذلك كل التعليقات هي موضع ترحيب. شيء واحد لا أفهمه هو الدعوة إلى creadblobstream. يجب أن أتحقق من fastmm لذلك ليس ميزة.
المحلول
باستخدام TidDecoder.DecodeBegin () هو الطريقة الصحيحة لفك التشفير إلى صباض. ومع ذلك، لا تحتاج إلى Tidmemorystream الوسيط (الذي، راجع للشغل، لم يكن موجودا في Indy 10 لفترة طويلة الآن - فكر في الترقية إلى إصدار أحدث). يمكنك اجتياز دفق Blob بدلا من ذلك، على سبيل المثال:
var
BlobElement : TBATypedBlob;
BlobStreamStr : String;
BlobStream : TStream;
MIMEDecoder : TidDecoderMIME;
begin
...
if BoldElement is TBATypedBlob then
begin
BlobElement := BoldElement as TBATypedBlob;
BlobStreamStr := Copy(ChangeValue, Pos(']',ChangeValue)+1, Maxint);
BlobElement.ContentType := Copy(ChangeValue, 2, Pos(']',ChangeValue)-2);
BlobStream := BlobElement.CreateBlobStream(bmWrite);
try
MIMEDecoder := TidDecoderMIME.Create(nil);
try
MIMEDecoder.DecodeBegin(BlobStream);
try
MIMEDecoder.Decode(BlobStreamStr);
finally
MIMEDecoder.DecodeEnd;
end;
finally
FreeAndNil(MIMEDecoder);
end;
finally
FreeAndNil(BlobStream);
end;
end;
...
end;
نصائح أخرى
نعم لقد غيروا الكثير بين 9 و 10.
الآن لديك "decodytes" بدلا من فك التشفير. لذلك يجب أن يفعل شيء من هذا القبيل:
var
DecodedBytes: TIdBytes;
begin
MIMEDecoder := TidDecoderMIME.Create(nil);
try
DecodedBytes := MIMEDecoder.DecodeBytes(vString);
vStream.Write(DecodedBytes[0], Length(DecodedBytes));
finally
FreeAndNil(MIMEDecoder);
end;
end;