Delphi - TIdAttachment, удалить путь из имени файла вложения - PullRequest
0 голосов
/ 12 марта 2012

Я генерирую электронные письма с вложениями через программу Delphi, используя Indy 10 и TIdAttachment.Расположение / имя файла хранится в таблице базы данных как //server/files/attachments/MyAttachment.pdf.Я прикрепляю файл к электронному письму следующим образом:

   // Add each attachment in Attachments
    for Attachment in Attachments do begin
      // Make sure file name exists before trying to add
     if FileExists(Attachment) then
       TIdAttachmentFile.Create(MessageParts, Attachment);
    end;

Когда я отправляю электронное письмо, прикрепленный файл называется

'__server_files_attachments_MyAttachment.pdf'.

Есть ли способудалить путь к файлу, чтобы вложение отображалось как «MyAttachment.pdf», когда получатель получает электронное письмо?

Я пытался использовать ExtractFileName (), но безуспешно.Я не думаю, что это работает, поскольку путь и имя файла поступают из базы данных в виде одной строки.

РЕДАКТИРОВАТЬ

Я также пытался извлечь само имя файласледующим образом:

function GetFileName(FullPath: string): string;
var
   StrFound: TStringList;
begin
    StrFound := TStringList.Create();
    ExtractStrings(['/'], [' '], PChar(FullPath), StrFound);
    result := StrFound[StrFound.Count - 1];
end;

Возвращает «MyAttachment.pdf», но в результате Delphi ищет в папке, в которой работает программа, файл, а не в «// server / files / attachments».Похоже, что если я не могу переименовать вложение после вызова TIdAttachmentFile.Create (), я не могу изменить имя файла.

РЕДАКТИРОВАТЬ - РЕШЕНИЕ

Отображение решения с использованием комментариев Реми(и используя GetFileName() сверху):

// Add each attachment in Attachments
for Attachment in Attachments do begin
  // Make sure file name exists before trying to add
  if FileExists(Attachment) then begin
     with TIdAttachmentFile.Create(MessageParts, Attachment) do begin
       Filename := GetFileName(Attachment);
     end;
  end;
end;

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Windows может распознавать '/' как разделитель пути, но RTL не делает. Локальные и UNC-пути должны использовать взамен '\'. Вам придется нормализовать строку имени файла с '/' до '\', прежде чем передавать ее в Indy, например, с помощью UnixPathToDosPath().

2 голосов
/ 12 марта 2012

Вы можете создать файл TIdAttachmentFile только с тем именем файла, которое вы хотите, чтобы вложение имело. После создания установите для свойства StoredPathName вложения полный путь.

var
  a: TIdAttachmentFile;
  FileName: string;

...

  FileName := ExtractFilePath(AttachmentPath);
  a := TIdAttachmentFile.Create(MessageParts, FileName);
  a.StoredPathName := AttachmentPath;
0 голосов
/ 12 марта 2012

Вызов TIdAttachment.Create включает в себя собственный вызов ExtractFilename, поэтому вам не нужно вызывать его заранее - ему нужен этот путь для поиска ваших файлов.

Я думаю, что вы находитесь впоймать-22, вам нужно отправить TidAttachment.Create путь, который он понимает, потому что он использует полный путь для добавления вашего файла, затем он извлекает только имя файла для вас, как вы хотите включить в свое сообщение.Я не думаю, что он работает так, как вы хотите, потому что он не может выполнить часть ExtractFilename надлежащим образом.Поэтому вместо того, чтобы извлекать имя файла, просто сформируйте путь таким образом, чтобы TIdAttachment.Create мог его понять.

В этом случае я бы попытался сопоставить диск и использовать его как:

Z: \ files \ attachments \ MyAttachment.pdf = //server/files/attachments/MyAttachment.pdf

Просто предварительно обработайте вложения, заменив // сервер на Z: \ и / with \затем попробуйте.

Отредактировано с учетом комментария Реми: Поменяйте местами / chars на \ chars

\\ server \ files \ attachments \ myattachment.pdf

Затем сделайте вызовTIdAttachment.Create

...