Перейти к содержанию
Fire Monkey от А до Я
  • 0

Русский язык при загрузке фото


AndroidHalfNoob

Вопрос

До делал процедуру загрузки фото с телефона на сервер, но выяснился интересный момент. Если название для фото задаю в латинской раскладке, то все нормально и сохраняется и отправляется, если задаю имя файла в русской раскладке, то на телефоне файл сохраняется нормально и отображаются русские буквы, а вот  на сервере создается файл и все русские буквы пишутся знаками "?". Тут уже встречал функцию вроде как перевода из одной кодировки в другую, попробовал несколько вариантов но без результатно.

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
В 06.05.2016 в 10:01, AndroidHalfNoob сказал:

До делал процедуру загрузки фото с телефона на сервер, но выяснился интересный момент. Если название для фото задаю в латинской раскладке, то все нормально и сохраняется и отправляется, если задаю имя файла в русской раскладке, то на телефоне файл сохраняется нормально и отображаются русские буквы, а вот  на сервере создается файл и все русские буквы пишутся знаками "?". Тут уже встречал функцию вроде как перевода из одной кодировки в другую, попробовал несколько вариантов но без результатно.

попробуйте посмотреть  в снифере http соеденений (HTTP ANALYZER  как вариант) на винде что там в строке  если отправляет нормально то проблемы точно со скриптом возможно даже кодировка самого серверного скрипта ANSI/UTF-8

как вариант название файла можно передавать отдельно а сам скрипт уже чтобы после загрузки перейменовал файл

Ссылка на комментарий
  • 0
В 11.05.2016 в 15:06, noisy сказал:

Покажите код отправки фото и серверную часть (прием и сохранение)

выложу полную процедуру с комментариями

Алгоритм:

Получаю изображение с камеры или из галереи телефона и загружаю это изображение в Image2.

Далее сохраняю изображение из Image2 во внутреннюю память телефона.

Потом открываю этот сохраненный файл и загружаю его в поток. И этот поток передаю в виде запроса в скрипт, который лежит на сервере.

Скрипт лежит рядом с папкой куда складываются все фото

Цитата

procedure TForm8.Button2Click(Sender: TObject);
   var
TelephonyObj: JObject;
TelephonyManager: JTelephonyManager;
par, s,imei,imeibaza:string;
ms:tmemorystream;
risunok:TBitmap;
st:Tidmultipartformdatastream;
RS: TStringStream ;
Height, Width: Integer;
begin

{изменение размера картинки начало}
  Height := 160;                                        
  Width := 120;                                          
  Image2.Bitmap.Resize(Width, Height); 

{конец}

{сохранение картинки во внутреннюю память телефона}

Image2.Bitmap.SaveToFile(System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetSharedDownloadsPath,edit1.text+'.jpg'));

{конец}

{получение сохраненной картинки}
RS := TStringStream.Create('');st:=Tidmultipartformdatastream.Create; 
 par:= GetMIMETypeFromFile(System.IOUtils.TPath.GetSharedDownloadsPath+'/'+AnsiToUtf8(edit1.Text)+'.jpg') ;//получение пути и подстановка имени файла из edit1
 try
 st.AddFile( 'uploadfile',System.IOUtils.TPath.GetSharedDownloadsPath+'/'+AnsiToUtf8(edit1.Text)+'.jpg' ,par );
 except
     ShowMessage('Произошла ошибка. Файл не найден. ')  ;
     exit;
 end;
{конец}

{отправка файла на сервер}
 IdHTTP1.Request.ContentType := 'multipart/form-data';
 try
 IdHTTP1.Post('http://Сайт/Foto/avatar.php',st,RS); // avatar.php - имя скрипта php
 except
  on E: Exception do
    ShowMessage('Что то пошло не так '+E.Message);

  end;

{конец}


 

 Form1.Show;
 Form8.Hide;

end;

 

и еще подключить

uses
   System.Generics.Collections,
 FMX.Helpers.Android, Androidapi.JNIBridge,idMultiPartFormData, System.IOUtils,  IdGlobalProtocols,

чтобы все это работало.

789789789.jpg

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

r:= GetMIMETypeFromFile(System.IOUtils.TPath.GetSharedDownloadsPath+'/'+AnsiToUtf8(edit1.Text)+'.jpg') ;//получение пути и подстановка имени файла из edit1

думаю нужно использовать System.NetEncoding.TNetEncoding.Encode
т.е. Encode(System.IOUtils.TPath.GetSharedDownloadsPath+'/'+edit1.Text+'.jpg')

Ссылка на комментарий
  • 0
14 минуты назад, noisy сказал:

r:= GetMIMETypeFromFile(System.IOUtils.TPath.GetSharedDownloadsPath+'/'+AnsiToUtf8(edit1.Text)+'.jpg') ;//получение пути и подстановка имени файла из edit1

думаю нужно использовать System.NetEncoding.TNetEncoding.Encode
т.е. Encode(System.IOUtils.TPath.GetSharedDownloadsPath+'/'+edit1.Text+'.jpg')

Можно по подробнее расписать как это будет выглядеть в моем случае? и я думаю, что надо декодировать строку во время отправки файла на сервер. Так как во время отправки ему присваивается имя, а это строка

Цитата

 st.AddFile( 'uploadfile',System.IOUtils.TPath.GetSharedDownloadsPath+'/'+AnsiToUtf8(edit1.Text)+'.jpg' ,par );

 

Ссылка на комментарий
  • 0

Ну в PHP я вообще не силен. мне бы как нибудь средствами Delphi реализовать правильное формирование имени файла.
Ну или может у кого есть готовая функция для php?

Ссылка на комментарий
  • 0
<?php

if ( copy($_FILES['uploadfile']['tmp_name'],"Avatari/".basename($_FILES['uploadfile']['name']))) print "ok" ;
else print "no" ;

?>

Вот весь текст. больше там ни чего нет.

Изменено пользователем Andrey Efimov
Добавил тег для кода
Ссылка на комментарий
  • 0
3 часа назад, AndroidHalfNoob сказал:

Вот весь текст. больше там ни чего нет.

<?php
$name=$_FILES['uploadfile']['name'];
if ( copy($_FILES['uploadfile']['tmp_name'],"Avatari/".basename(iconv("utf-8", "cp1251", "$name")))) print "ok" ;
else print "no" ;
?>

попробуйте так только файл обязательно в кодировке utf-8 

и многое зависит от ос на сервере какая стоит универсального решения нет

 

P/S и пробуйте передать имя файла отдельным параметром  файлом уже после перезагрузки перейменовать проще отловить будет косяк

Изменено пользователем Andrey Efimov
Добавил тег для кода
Ссылка на комментарий
  • 0
3 часа назад, master webs сказал:

<?php
$name=$_FILES['uploadfile']['name'];
if ( copy($_FILES['uploadfile']['tmp_name'],"Avatari/".basename(iconv("utf-8", "cp1251", "$name")))) print "ok" ;
else print "no" ;
?>

попробуйте так только файл обязательно в кодировке utf-8 

и многое зависит от ос на сервере какая стоит универсального решения нет

 

P/S и пробуйте передать имя файла отдельным параметром  файлом уже после перезагрузки перейменовать проще отловить будет косяк

один нюанс. Фото грузится с телефона, а там Андройд. Разве у Андройда кодировка cp1251?

Кстати выяснил. на сервере кодировка utf-8 

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
3 минуты назад, AndroidHalfNoob сказал:

один нюанс. Фото грузится с телефона, а там Андройд. Разве у Андройда кодировка cp1251?

вы смотрели с андроида уходит  в нормальном виде ?

кирилица чесно говоря  опасная штука на сервере я делал запросы на сервер для поиска через api кирилица с пробелами так вот без StrToJURI(Url) вот такой конструкции в делфи ничего не вышло 

а кодировка сервера может все ломать на стадии записи в файл 

если имя передаете правильно то косяк только на сервере вам проверить  нужно всеголиш что где и как отправляет

Изменено пользователем master webs
Ссылка на комментарий
  • 0
Цитата

<?php
$name=$_FILES['uploadfile']['name'];
if ( copy($_FILES['uploadfile']['tmp_name'],"Avatari/".basename(iconv("utf-8", "cp1251", "$name")))) print "ok" ;
else print "no" ;
?>

Не дало результата. На скрине русское название все состоит из ???????

 

 

1.jpg

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0
1 час назад, Andrey Efimov сказал:

А что мешает просто сконвертить имя в транслит, сохранить и уже потом передавать на сервер?

Скорее всего так и придется делать.

Ссылка на комментарий
  • 0
29 минут назад, AndroidHalfNoob сказал:

Не дало результата. На скрине русское название все состоит из ???????

 

<?php
$good_text="текст документа";
$zagolovok=iconv("UTF-8", "WINDOWS-1251//IGNORE", "название");
$bd = fopen ($zagolovok.'.txt','w') or die("Не могу открыть файл"); 
fwrite($bd, $good_text);
?>

рабочий пример запустите через браузер в корне должен появится текстовый файл если не заработает ковыряйте кодировку

<?php

$text = "Текст на кирилице";

echo 'Original : '.$text;
echo 'TRANSLIT : '.iconv("UTF-8", "WINDOWS-1251//TRANSLIT", $text);
echo 'IGNORE   : '.iconv("UTF-8", "WINDOWS-1251//IGNORE", $text);
echo 'Plain    : '.iconv("UTF-8", "WINDOWS-1251", $text);
?>

через браузер тоже можно смотреть

кодировка может быть WINDOWS-1251, ASCII,ISO-8859-1

Изменено пользователем master webs
Ссылка на комментарий
  • 0

Лучше сделайте сразу правильно, все равно придете к этому, при загрузке фото на сервер переименовывайте файл, общепринятый вариант дать определенное стандартное имя, например наименование вашего проекта и время в формате unix, например:

Name+1424238237362, далее от имени сгенерировать MD5 хэш, и записать его в базу, после чего вернуть в ответ имя нового файла если нужен. Таким образом даже если будут одинаковые файлы имена не повторятся, а вот Random без проверки точно повторится, да и проверять надо постоянно базу шерстить.

Ссылка на комментарий
  • 0
15 часов назад, zairkz сказал:

Лучше сделайте сразу правильно, все равно придете к этому, при загрузке фото на сервер переименовывайте файл, общепринятый вариант дать определенное стандартное имя, например наименование вашего проекта и время в формате unix, например:

Name+1424238237362, далее от имени сгенерировать MD5 хэш, и записать его в базу, после чего вернуть в ответ имя нового файла если нужен. Таким образом даже если будут одинаковые файлы имена не повторятся, а вот Random без проверки точно повторится, да и проверять надо постоянно базу шерстить.

Проект для узкого круга людей. Думаю человек 30 от силы будут пользоваться программой. И фото используются только для отображения Аватарки.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...