Topic: Сохранение файла на Web Disk

Добрый день, есть необходимость сохранять некоторые файлы хранящиеся в базе MySQL на расшаренный Web Disk. Как это можно реализовать в MVD? Буду признателен за любой совет, особенно за совет с примером кода)

Re: Сохранение файла на Web Disk

Поинтересовался, как реализована функция обмена файлами через FTP в Delphi. Для этого используется библиотека TIdFTP. Вопрос к разработчикам, а в MVD есть возможность пользоваться данной библиотекой?

3 (edited by sibprogsistem 2021-05-19 16:45:08)

Re: Сохранение файла на Web Disk

zenja wrote:

Поинтересовался, как реализована функция обмена файлами через FTP в Delphi. Для этого используется библиотека TIdFTP. Вопрос к разработчикам, а в MVD есть возможность пользоваться данной библиотекой?

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=7722&download=0

Post's attachments

Attachment icon Безымянный.png 250.3 kb, 97 downloads since 2021-05-19 

Re: Сохранение файла на Web Disk

Спасибо за наводку, что-то я протупил)

Re: Сохранение файла на Web Disk

Еще раз спасибо sibprogsistem за подсказку, все получилось.

Рабочий код работы с FTP:

procedure frmForma_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  ftp: TIdFTP;
begin
ftp:=TIdFTP.Create(Application);
  try
    try
      ftp.Host:='ftp.server.my'; // Fдрес FTP-сервера
      ftp.Port:=21;
      ftp.Username:='test@server.my';//Логин
      ftp.Password:='123456789';//Пароль
      ftp.Connect;
      ftp.Passive := true; // Важный параметр, как оказалось, на больнистве FTP-серверов по умолчанию стоит активный режим, и передача файлов не проходит

         ftp.ChangeDir('/image/'); //Каталог на сервере с которым работаем
         ftp.Put('D:\tmp\img.jpg','img.jpg'); //Отправка файла
         //ftp.Get('img.jpg,'D:\tmp\img.jpg, false); // Прием файла
         ShowMessage('Передача файла успешно завершена!');
    finally
    ftp.free;
    end;
  except
    ShowMessage('Ошибка передачи файла!');
  end;
end;

Re: Сохранение файла на Web Disk

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

Re: Сохранение файла на Web Disk

zenja wrote:

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

Добрый день!
Помнится, давно ещё при работе с FTP с командной строкой был параметр TYPE, который может быть или ASCII, или BINARY. Видимо, по умолчанию передаётся в ASCII.

8 (edited by zenja 2021-06-10 12:23:35)

Re: Сохранение файла на Web Disk

mcsimm wrote:

Добрый день!
Помнится, давно ещё при работе с FTP с командной строкой был параметр TYPE, который может быть или ASCII, или BINARY. Видимо, по умолчанию передаётся в ASCII.

Совершенно верно, дело в типе передаваемых данных. Я поднял информацию по библиотеке Indy10, после установления соединения с сервером нужно указать тип передаваемых данных, выглядит это вот так:

ftp.TransferType := ftBinary;

Но MVD почему-то не принимает эту строку, пишет "Undeclared identifier: 'ftBinary'". Честно говоря, разбираться некогда, пока отложил этот вопрос, но обязательно к нему вернусь.

9 (edited by zenja 2021-07-02 12:26:46)

Re: Сохранение файла на Web Disk

Наконец-то дошли руки довести до ума скрипт передачи данных по протоколу FTP. Как я уже писал, проблема передачи графических данных в установленном типе протокола передачи данных. Библиотека Indy по умолчанию устанавливает ASCII, но для передачи графики этот тип данных не подходит, нужен BINARY. В описаниях функции TIdFTP установка типа протокола выглядит следующим образом:

ftp.TransferType := ftBinary;

Но MVD 'ftBinary' не понимает, и выдает ошибку 'Undeclared identifier'. Логическим путем пришел к выводу, что вся проблема в синтаксисе, моя догадка подтвердилась) Тип данных определяется числовым значением: 0 - ASCII, 1 - BINARY. 

ftp.TransferType := 1 // BINARY;

Проверил на передаче файлов в форматах JPG и PNG, файлы передаются правильно, качество переданного изображения соответствует оригиналу.
Пример рабочего кода:

procedure frmForma_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
  ftp: TIdFTP;
begin
ftp:=TIdFTP.Create(Application);
  try
    try
      ftp.Host:='ftp.server.my'; // Fдрес FTP-сервера
      ftp.Port:=21;
      ftp.Username:='test@server.my';//Логин
      ftp.Password:='123456789';//Пароль
      ftp.Connect;
      ftp.Passive := true; // Важный параметр, как оказалось, на больнистве FTP-серверов по умолчанию стоит активный режим, и передача файлов не проходит
      ftp.TransferType := 1; //Устанавливаем тип передаваемых даных: 0 - ASCII, 1 - BINARY 

         ftp.ChangeDir('/image/'); //Каталог на сервере с которым работаем
         ftp.Put('D:\tmp\img.jpg','img.jpg'); //Отправка файла
         //ftp.Get('img.jpg,'D:\tmp\img.jpg, false); // Прием файла
         ShowMessage('Передача файла успешно завершена!');
    finally
    ftp.free;
    end;
  except
    ShowMessage('Ошибка передачи файла!');
  end;
end;

На предмет приема файлов не тестировал, думаю, будет все нормально и с приемом.