Я хочу быть в состоянии сохранить мои данные вложения в моей базе данных MySQL.Я предполагаю, что это означает, что я должен сохранить данные вложения в TStream - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь вставить свои данные вложения с сервера IMAP в базу данных MySQL, используя методы TBlobStream.

procedure TForm1.Button1Click(Sender: TObject);
var
  imap_message_count:Integer;
  current_record:Integer;
  imap_id:String;

  email_parts_count:Integer;
  current_email_part:Integer;


  attachment_stream:TStream;
  blob_stream:TStream;
  final_stream:TStream;

  attachment_data_set:TDataSet;
  attachment_data:TFDQuery;
  blob_field:TField;
begin
  IdIMAP41.Connect();
  if IdIMAP41.SelectMailBox('INBOX') then
  BEGIN
    imap_message_count := IdIMAP41.MailBox.TotalMsgs;
    for current_record := 1 to imap_message_count - 1 do
    begin
      IdIMAP41.GetUID(current_record, imap_id);
      IdIMAP41.UIDRetrieve(imap_id, IdMessage1);
      email_parts_count := IdMessage1.MessageParts.Count;
      for current_email_part := 1 to email_parts_count - 1 do
      begin
        if IdMessage1.MessageParts.Items[current_email_part] is TIdAttachment then
        begin
          attachment_stream := TIdAttachment(IdMessage1.MessageParts.Items[current_email_part]).OpenLoadStream;
          try
           AttachmentsTable.Insert;
           blob_field := AttachmentsTable.FieldByName('attachment');
            blob_stream := AttachmentsTable.CreateBlobStream(blob_field, bmWrite);
              try
                blob_stream.CopyFrom(attachment_stream, 0);
              finally
                AttachmentsTable.Post;
                blob_stream.Free;
              end;
           finally
            TIdAttachment(IdMessage1.MessageParts.Items[current_email_part]).CloseLoadStream;
           end;
        end;
      end;
    end;
  END;

end;

В настоящее время я могу вставить идентификатор, так как он автоинкрементен, но когда я смотрю на поле вложения базы данных, я получаю результат Null.В чем может быть моя проблема?

Я предполагаю, что не правильно обращаюсь к своим данным blob_stream.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 28 октября 2018
if IdMessage1.MessageParts.Items[current_email_part] is TIdAttachment then
        begin     
              attachment_stream := TIdAttachment(IdMessage1.MessageParts.Items[current_email_part]).OpenLoadStream;
          try
           AttachmentsTable.Insert;
           blob_field := AttachmentsTable.FieldByName('attachment');
           blob_stream := AttachmentsTable.CreateBlobStream(blob_field, bmWrite);
              try
                blob_stream.CopyFrom(attachment_stream, attachment_stream.Size);
              finally
                blob_stream.Free;
                AttachmentsTable.Post;
              end;
           finally
            TIdAttachment(IdMessage1.MessageParts.Items[current_email_part]).CloseLoadStream;
           end;
        end;
0 голосов
/ 19 октября 2018

Вы на правильном пути, но делаете все неправильно.

Чтобы получить доступ к существующим данным вложения, используйте метод OpenLoadStream(), например:

var
  att_stream: TStream;

if IdMessage1.MessageParts.Items[current_email_part] is TIdAttachment then
begin
  att_stream := TIdAttachment(IdMessage1.MessageParts.Items[current_email_part]).OpenLoadStream();
  try
    // use att_stream data as needed, 
    // such as saving it to a DB... 
  finally
    TIdAttachment(IdMessage1.MessageParts.Items[current_email_part]).CloseLoadStream();
  end;
end;

PrepareTempStream() предназначен для сохранения новых данных во вложении.OpenLoadStream() предназначен для чтения данных из вложения.

...