Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Upload не из html-формы 
:(
    Опции темы
GavriKos
Дата 12.5.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Доброго времени суток. Есть задача - нужно реализовать аплоад файлов на сервер не через html-форму, а из обычного приложения. В приложении отправляю обычный POST-запрос (без енкодинга как для заливки файлов). В пхп-скрипте подразумевается присланные данные в POSTе сохранить в бинарный файл. Написал на пхп вот такой код:

Код

<?php
$file = fopen("log","wb");
$size = $_POST["len"];
for ($i=0;$i<$size;$i++)
    //fputs($file,$_POST['file'][$i],1);
    //fprintf($file,"%c",($_POST['file'][$i]));
    
    fwrite($file,$_POST['file'][$i],1);
fclose($file);
?> 


Вроде все правильно, но такой код сохраняет файл в текстовом виде, а не в бинарном. fputs тоже дает текстовый файл. ПРичем размер текстового меньше (намного) размера передаваемого бинарника - срабатывает какая то перекодировка. Единственный вариант, который выдал бинарный файл
 
Код

fprintf($file,"%c",($_POST['file'][$i]));

Причем именно "%c" (%s дает текстовый файл). Но при этом данные все равно были сохранены неправильно (80% файла - пустые символы, причем даже реально читаемые символы в бинарнике не записываются таким методом).

Прочитал про отмену перекодировки путем прописывания пары строчек в htaccess - не помогло.

Кто что подскажет по проблеме?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
MoLeX
Дата 12.5.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(GavriKos @  12.5.2011,  11:08 Найти цитируемый пост)
Есть задача - нужно реализовать аплоад файлов на сервер не через html-форму, а из обычного приложения.

Цитата(GavriKos @  12.5.2011,  11:08 Найти цитируемый пост)
В приложении отправляю обычный POST-запрос


Код

var_dump($_FILES);




--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
GavriKos
Дата 12.5.2011, 17:01 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Может 
Код

var_dump($_POST['file']);

?

Выяснил, что пхп кодирует по-своему некоторые символы, вне зависимости от того, как ему передаются данные. Соответственно надо на стороне отправляющей данные перекодировать так, чтобы пхп ничего с ними не сделал, но это другой вопрос.

А вот вопрос о корректности выкидывания в файл остался - fwrite записывает меньше данных, причем существенно. Даже если принудительно, в цикле вычитывать по одному символу. Символов окончания строки нету в теле.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
bars80080
Дата 12.5.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(GavriKos @  12.5.2011,  17:01 Найти цитируемый пост)
Может 
Выделить всёкод PHP
1:
    
var_dump($_POST['file']);

?

нет. посмотрите, что вам приходит в массиве $_FILES

пхп до фени, какой клиент передаёт ему данные, он принимает их одинаково. поэтому вы можете брать любой пхп-скрипт серверной обработки загружаемых файлов, и он подойдёт, что для хтмл-формы с вэб-странички, что для вашего приложения.

данные о приходящих файлах записываются в массив $_FILES, и никак не $_POST или $_GET
PM MAIL WWW   Вверх
GavriKos
Дата 12.5.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



1) С дампом переменной ничего не получится - прога не обрабатывает то, что вывелось скриптом на страницу. Так что судить о результатах можно только по файлам
2) Все таки по поводу $_FILES - если я отправляю самый обычный пост-запрос, с телом file=содержимое_файла, то пхп вроде ничего в $_FILES не запишет. Запрос самый обычный, без указания о том, что идет файл.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
MoLeX
Дата 13.5.2011, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



GavriKos, не знаю как вы отправляете данные и с помощью какого языка, поэтому привожу пример для C++ Builder
Код

#include <IdMultipartFormData.hpp>

TStringStream *Result = new TStringStream("");
TIdMultiPartFormDataStream *Data= new TIdMultiPartFormDataStream();
Data->AddFile("fileupload", "D:\\file.txt", "multipart/form-data");

IdHTTP1->Request->ContentType = Data->RequestContentType;
IdHTTP1->Request->ContentLength = Data->Size;
IdHTTP1->Post("http://127.0.0.1/test.php", Data, Result);

Memo1->Text = Result->DataString;


и на сервере test.php
Код

var_dump($_FILES);



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 13.5.2011, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(GavriKos @  12.5.2011,  19:52 Найти цитируемый пост)
 Все таки по поводу $_FILES - если я отправляю самый обычный пост-запрос, с телом file=содержимое_файла

Получится неправильно. Для метода POST существует 2 типа кодирования multipart/form-data и application/x-www-form-urlencoded. Второй используется по умолчанию. Как можно заметить, для первого следует соблюдать "границы", со вторым - кодировать служебные символы в urlencode стиле.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GavriKos
Дата 13.5.2011, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



ksnk, отправляю именно в application/x-www-form-urlencoded. Вывод - лучше разобраться как отправлять в multipart/form-data )) Тогда и дамп будет актуальнее.


MoLeX, отправляю через связку c++ + wxCurl. Типа кодирования в параметрах нету. Или не нашел (
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
MoLeX
Дата 13.5.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



посмотри компонент IdHTTP, Indy лучше последние

Это сообщение отредактировал(а) MoLeX - 13.5.2011, 08:23


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
GavriKos
Дата 13.5.2011, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



MoLeX, это, я так понял, библиотеки для работы с вебом... Уже пол проекта на wxCurl писано. Но мысль с кодированием правильная?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
ksnk
Дата 13.5.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

file_get_contents('php://input');

сохранить в файл и помедитировать.
Вроде, то, что посылается, то и должно прилететь для application/x-www-form-urlencoded


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GavriKos
Дата 13.5.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Код

<?php
$file = fopen("log",'wb');
fwrite(file_get_contents("php:\\input"));
fclose($file);
?> 


Пустой файл н выходе ( Данны еточно посылаются.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
bars80080
Дата 13.5.2011, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(GavriKos @  13.5.2011,  15:25 Найти цитируемый пост)
$file = fopen("log",'wb');

первый раз вижу модификатор wb

Добавлено через 1 минуту и 10 секунд
Цитата(GavriKos @  13.5.2011,  15:25 Найти цитируемый пост)
fwrite(file_get_contents("php:\\input"));

а это вообще как получилось?

http://ru2.php.net/manual/en/function.fwrite.php
PM MAIL WWW   Вверх
Pfailed
Дата 14.5.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



libcurl умеет multipart, подозреваю что его wx оболочка тоже. http://curl.haxx.se/libcurl/c/curl_easy_se...CURLOPTHTTPPOST


--------------------
PM MAIL   Вверх
GavriKos
Дата 14.5.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



bars80080, wb - нормальный модификатор. w - создать для записи, b - бинарный режим.
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.