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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Надо сохранить бинарные данные в файл из POSTa 
:(
    Опции темы
javastic
Дата 31.3.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Всем привет.

Как сохранить бинарные данные в файл переданные в закодированном виде (Base64) через POST метод?
Я думаю у профи это не вызовет труда, а я только учусь. smile

У меня получилось следущее:

Код

  $file = fopen($name, "wb");
  fwrite($file, base64_decode($HTTP_POST_VARS["data"]) );
  close($file);


Но файл сохраняется с битыми данными. =( Я делал и через переменную, а потом её прописывал в fwrite и так, всё одно, видимо символы до 31 кода не сохраняются, т.к. во время записи данные представляются как строковые (моё предположение).

Поделитесь мыслью, да и код бы хотелось правильный увидеть.




--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Drache
Дата 1.4.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А что собой представляет $HTTP_POST_VARS["data"] ?
Какой тип input'а ?
PM MAIL   Вверх
Guedda
Дата 1.4.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Попробуй через переменную:
Код

$file = fopen($name, "wb");
fwrite($file, base64_decode($_POST['data']) );
close($file);



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonioBanderaz
Дата 1.4.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


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

Репутация: 2
Всего: 18



А ты чем передаёшь?
Как я понимаю данные передаются всяко не браузером....

Там где ты передаёшь пошли доп заголовки:
Код

Content-Type: multipart-form/data; boundary=TEST \r\n
Content-Lenght: Длина после двух певодов строки \r\n
\r\n
--TEST
Content-Disposition: form-data; name="FNAME"; filename="FPATH"; \r\n
Content-Type: application/base64 \r\n
\r\n
и просто потоком сюда фигачишь файл
--TEST--


А уже в PHP обрабатывай не как через &_POST['data'], а как $_FILES[].... Сначала сохрани, а потом уже раскодируй....

Это сообщение отредактировал(а) AntonioBanderaz - 2.4.2006, 10:32


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
javastic
Дата 2.4.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



Drache, Это картинка закодированная base64.
Добавлено @ 09:41
Guedda, ок, попробую. спасибо.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
javastic
Дата 2.4.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



AntonioBanderaz, передаю через мобильник. Content-Type: application/x-www-form-urlencoded


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
Drache
Дата 2.4.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну это конечно хорошо, что картинка, но я не о том smile
начнем с самого начала: перед тобой формочка. Как ты добавляешь картинку эту самую? Инпут типа файл или как ты это делаешь?
Если да, то послушай AntonioBanderaz, правильно говорит.

to Gueda: и что поменялось? Насколько я знаю, твой вариант как раз сработает только в более позжих версиях пхп, а вариант javastic'a сработает в любом случае.
PM MAIL   Вверх
AntonioBanderaz
Дата 2.4.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


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

Репутация: 2
Всего: 18



javastic, попробуй сравнить что у тебя пришло в BASE64...
На самом деле если ты передаёшь картинку, то не проще ли сделать multipart форму, и уже в didposition полставить MIME тип той картинки, которую ты передаёшь? Это будет мне кажется правильнее.... В base64 у тебя размер картинки увеличится в 1.3 раза...

Что я имею ввиду:
Код

POST /test.php HTTP/1.1 \r\n
Host: localhost:8080 \r\n
Content-Type: multipart-form/data; boundary=picture \r\n
Content-Lenght: 123456 \r\n
Accept: */* \r\n
\r\n

Само тело, то для чего считаем Content-Lenght
Код

--picture \r\n
Content-Disposition: form-data; name="PICTURE"; filename="PICTURE.GIF" \r\n
Content-Type: image/gif \r\n
\r\n
Тут тело картинки \r\n
--picture--


На вскидку MIME типы которые могу припомнить
Код

   image/gif
   image/x-xbitmap
   image/jpeg
   image/png
   image/pjpeg


Что на стороне PHP:
не нужно ни каких постов просто бери из массива $_FILES и сохраняй её куда тебе нужно )))


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
javastic
Дата 3.4.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



AntonioBanderaz, у меня есть уже вариант с Multipart-form/data и он работает, спасибо. Просто я видел пример где использован base64 и я решил повторить сиё.

Кстати, ещё такая ситуация. Если я передаю данные как boundary но блоками, как быть тогда в таком случае? Пусть есть файл размером 20Кб, я хочу передавать блоками по 2Кб.
И ещё, помимо файла мне нужно передать некую дополнительную информацию, к примеру e-mail того человека который передает картинку серверу.

В первом случае всё просто: [email protected]&data=NI23nCDHEWHBSdhs= и т.д.
во втором случае:
Content-Disposition: form-data; name="PICTURE"; filename="PICTURE.GIF" \r\n
Content-Type: image/gif \r\n
\r\n
M23CVEPIOifjefnwf283r t2g973d8r3g72g3s7d63g4d6r8gd423 \r\n

вот что меня стопарнуло в отношении второго случая.
Добавлено @ 09:21

Drache, я передаю картинку не через форму, а через мобильное приложение.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 3.4.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


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

Репутация: 2
Всего: 18



Цитата(javastic @ 3.4.2006, 09:20 Найти цитируемый пост)
Кстати, ещё такая ситуация. Если я передаю данные как boundary  но блоками, как быть тогда в таком случае? Пусть есть файл размером 20Кб, я хочу передавать блоками по 2Кб.И ещё, помимо файла мне нужно передать некую дополнительную информацию, к примеру e-mail того человека который передает картинку серверу.

Да не так сложно, вот тебе примерчик небольшой.... )
Код

POST /test.php HTTP/1.1 \r\n    
Host: localhost:8080 \r\n    
Content-Type: multipart-form/data; boundary=picture \r\n    
Content-Lenght: 123456 \r\n    
Accept: */* \r\n    
\r\n
--picture \r\n    
Content-Disposition: form-data; name="PICTURE_1"; filename="PICTURE_1.GIF" \r\n    
Content-Type: octet/streem \r\n    
\r\n    
Первые 20КБ \r\n
--picture \r\n    
Content-Disposition: form-data; name="PICTURE_2"; filename="PICTURE_2.GIF" \r\n    
Content-Type: octet/streem \r\n    
\r\n    
Вторые 20КБ \r\n    
--picture \r\n
Content-Disposition: form-data; name="EMAIL" \r\n
Content-Type: text/html \r\n
\r\n
[email protected] \r\n
--picture--


Это сообщение отредактировал(а) AntonioBanderaz - 3.4.2006, 19:50


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
javastic
Дата 4.4.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



AntonioBanderaz, класс! =) Спасибо! Всё понял.
smile


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
javastic
Дата 5.4.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



AntonioBanderaz, ещё вопрос. Допустим я не могу отправить всё одним пакетом, а только отдельными (по 20кб), но к примеру с разными именами. Как мне потом склеить эти несколько файлов? Или может есть способ принимать и добавлять сразу к имеющимся данным? (второе было бы предпочтительней).

У меня в скрипте используется
Код

$uploadfile = $uploaddir . $_FILES['myfile']['name'];
move_uploaded_file($_FILES['myfile']['tmp_name'], $uploadfile);


Может можно применить fwrite ?


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 5.4.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


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

Репутация: 2
Всего: 18



Цитата(javastic @ 5.4.2006, 17:19 Найти цитируемый пост)
Может можно применить fwrite ?

Даже нужно.... можно также fputs (Это её псевдоним)
Дерзай, я просто на работе и не могу больше ответить.... Я тебе из дома скину пример кода


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
javastic
Дата 6.4.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

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



AntonioBanderaz, спасибо! =) Разобрался сам.



--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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