|
|
|
| Привет всем,
Я новичок в 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.
я в полном недоумении... | |
|
|
|
|
|
|
|
для: dbk
(06.02.2005 в 12:57)
| | Хм... а кем и как данные посылаются, от этого тоже много зависит? | |
|
|
|
|
|
|
|
для: cheops
(06.02.2005 в 13:09)
| | Данные посылаются мобильником с помощью java-мидлета.
Открываю HttpConnection, открываю поток вывода, вывожу свои байты, закрываю поток, получаю код ответа сервера. Могу запостить код, если это поможет...
Я уверен, что перекодировка происходит именно на сервере, потому что когда эти же байты записываются в другой файл на телефоне, то ничего подобного не происходит. | |
|
|
|
|
|
|
|
для: 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();
/** Выводим на экран результат. */
}
|
| |
|
|
|
|
|
|
|
для: dbk
(06.02.2005 в 16:56)
| | Советую передавать файлы, предварительно пропустив через base64_encode(). А в php скрипте уже base64_decode. Такой метод часто использует почта | |
|
|
|
|
|
|
|
для: 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
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(06.02.2005 в 18:11)
| | Спасибо большое!
У меня все получилось с base64. Я послал закодированные данные и сервер раскодировал их.
Без вас я бы ни за что не догадался. | |
|
|
|
|
|
|
|
для: dbk
(06.02.2005 в 12:57)
| | Мда... тогда нужно играть заголовками, во первых, зря указываете кодировку при отправке методом POST - она вам всё побъёт - попробуйте её не указывать... | |
|
|
|