Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: еще кодировка
 
 автор: dbk   (06.02.2005 в 12:57)   письмо автору
 
 

Привет всем,

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

Я столкнулся с проблемой, когда сервер перекодирует посылаемые ему данные методом post в переменной $HTTP_RAW_POST_DATA. Вот мой код:


<?php
$name 
"upload.gif";
$data $HTTP_RAW_POST_DATA;
if (
file_exists($name)) unlink($name);
if (!(
$file fopen($name"w")))
{
    echo 
"Unable to create file.";
    exit;
}
if (
fwrite($file$data)==FALSE)
{
    echo 
"Unable to write file.";
    
fclose($file);
    exit;
}
echo 
"Thank you.\n";
echo 
"File saved as $name.\n";
echo 
"Your IP-address is $REMOTE_ADDR.";
fclose($file);
?>


Мои http-headerы (хотя изменения в них никак не сказываются на результате):

User-Agent: Uploader
Content-Type: image/gif
Content-Length: <размер_файла>
Content-Encoding: windows-1251

Я пробовал даже составить таблицу соответствия символов, получаемых на сервере и отсылаемых на сервер. Это почти получилось, только у двух символов не нашлось соответствия, т.е. какой байт на сервер не посылай, в результате никогда не получишь 0xa3 и 0xb3.

я в полном недоумении...

   
 
 автор: cheops   (06.02.2005 в 13:09)   письмо автору
 
   для: dbk   (06.02.2005 в 12:57)
 

Хм... а кем и как данные посылаются, от этого тоже много зависит?

   
 
 автор: dbk   (06.02.2005 в 16:24)   письмо автору
 
   для: cheops   (06.02.2005 в 13:09)
 

Данные посылаются мобильником с помощью java-мидлета.
Открываю HttpConnection, открываю поток вывода, вывожу свои байты, закрываю поток, получаю код ответа сервера. Могу запостить код, если это поможет...
Я уверен, что перекодировка происходит именно на сервере, потому что когда эти же байты записываются в другой файл на телефоне, то ничего подобного не происходит.

   
 
 автор: dbk   (06.02.2005 в 16:56)   письмо автору
 
   для: cheops   (06.02.2005 в 13:09)
 

Вот код отправления файла:


HttpConnection connection; // Соединение с сервером
OutputStream ostream; // Поток вывода
InputStream istream; // Поток ввода

public void upload(String file, String server) throws IOException
{
// Создаем url.
String url=server+"savegif.php";

// Временный буфер.
byte [] buf=new byte[1024];

// Количество отправленных байт.
int sended=0;

// Открывается файл.
File f=new File();
int handler=f.open(file);
if (handler<0) throw new IOException();

// Узнаем длину файла.
int length=f.length(handler);

System.out.println("Connecting to "+url);
System.out.println("File length "+length);

// Устанавливаем соединение.
connection=(HttpConnection) Connector.open(url);

// Устанавливаем метод Post.
connection.setRequestMethod(HttpConnection.POST);

// Устанавливаем разные свойства.
connection.setRequestProperty("User-Agent", "Uploader");
connection.setRequestProperty("Content-Type", "image/gif");

// Открываем выходной поток.
ostream=connection.openOutputStream();

// Создаем массив байт, в который мы скопируем файл.
byte [] data=new byte[length];

while(true)
{
// Читаем в буфер данные.
int readed=f.read(handler, buf, 0, 1024);

// Файл закончился.
if (readed<=0) break;

// Копируем буфер в массив отправляемых байт.
System.arraycopy(buf, 0, data, sended, readed);

sended+=readed;
}

// Закрываем файл. На этом этапе все данные находятся в массиве data.
f.close(handler);

// Выводим его в поток.
ostream.write(data);

// Получаем код ответа сервера.
int response=connection.getResponseCode();

if (response!=HttpConnection.HTTP_OK)
{
/** Выводится сообщение об ошибке. */
throw new IOException();
}

// Получаем входной поток для чтения данных.
istream=connection.openInputStream();

int ch;
StringBuffer s=new StringBuffer();
while((ch=istream.read())!=-1) s.append((char) ch);

// Закрываем потоки и соединение.
ostream.close();
istream.close();
connection.close();

String result=s.toString();

/** Выводим на экран результат. */
}

   
 
 автор: isset   (06.02.2005 в 18:00)   письмо автору
 
   для: dbk   (06.02.2005 в 16:56)
 

Советую передавать файлы, предварительно пропустив через base64_encode(). А в php скрипте уже base64_decode. Такой метод часто использует почта

   
 
 автор: cheops   (06.02.2005 в 18:11)   письмо автору
 
   для: isset   (06.02.2005 в 18:00)
 

Кстати да, можно послать заголовок
Content-Transfer-Encoding: base64 

Тогда сервер должен сам будет переконвертировать содержимое. Точно так же можно использовать функцию urlencode(), для кодирования содержимого, тогда можно будет посылать заголовк
Content-type: application/x-www-form-urlencoded

а содержимое должно быть в формате key=value&key1=value1, тогда получить значения в исходном скрипте можно обращаясь к элементу суперглобального массива $_POST:
<?php
  
echo $_POST['key']; // value
  
echo $_POST['key1']; // value1
?>

   
 
 автор: dbk   (06.02.2005 в 19:36)   письмо автору
 
   для: cheops   (06.02.2005 в 18:11)
 

Спасибо большое!

У меня все получилось с base64. Я послал закодированные данные и сервер раскодировал их.

Без вас я бы ни за что не догадался.

   
 
 автор: cheops   (06.02.2005 в 18:05)   письмо автору
 
   для: dbk   (06.02.2005 в 12:57)
 

Мда... тогда нужно играть заголовками, во первых, зря указываете кодировку при отправке методом POST - она вам всё побъёт - попробуйте её не указывать...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования