Перейти к содержанию
  • Регистрация
  • 0
AndroidHalfNoob

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

Вопрос

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

Изменено пользователем AndroidHalfNoob

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

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

Изменено пользователем noisy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

В общем решил не мудрить и сделал все в две строчки:)

Цитата

 

Randomize;

zz:=Random(999999);

 

все равно в базу заносится имя и соответствующая ему фото.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 часов назад, zairkz сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


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

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

×
×
  • Создать...