Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/74: Рейтинг темы: голосов - 74, средняя оценка - 4.86
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018

Как передать файл методом POST вместе с другими текстовыми полями

22.04.2012, 09:46. Показов 15528. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите. Не получается передать файл методом POST, чтобы он был в целости и сохранности. Его нужно закодировать в url-строку, но я никак не могу понять как!
Дело в том, что в post-зпросе помимо передачи файла передаются также другие текстовые поля, и как все это вместе передать, не получается никак, вот уже 3 часа мучаюсь

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
 
namespace HttpPostFile
{
    class Program
    {
        static void Main(string[] args)
        {
            int next = 5;
            string winname = @"D:\Test\scr.png";
            string post1 = "winname=" + winname + "&next_time=" + next.ToString() + "&file=";
 
            byte[] file = FileToByteArray(winname);
 
            byte[] b1 = Encoding.GetEncoding(1251).GetBytes(post1);
 
            byte[] b3 = new byte[b1.Length + file.Length];
            Array.Copy(b1, b3, b1.Length);
            Array.Copy(file, 0, b3, b1.Length, file.Length);
 
            SendInfo(b3);
            Console.WriteLine("File uploaded.");
        }
 
        static private byte[] FileToByteArray(string _FileName)
        {
            byte[] _Buffer = null;
 
            // Open file for reading
            System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
 
            // attach filestream to binary reader
            System.IO.BinaryReader _BinaryReader = new System.IO.BinaryReader(_FileStream);
 
            // get total byte length of the file
            long _TotalBytes = new System.IO.FileInfo(_FileName).Length;
 
            // read entire file into buffer
            _Buffer = _BinaryReader.ReadBytes((Int32)_TotalBytes);
 
            // close file reader
            _FileStream.Close();
            _FileStream.Dispose();
            _BinaryReader.Close();
            return _Buffer;
        }
 
        static void SendInfo(byte[] postByte)
        {
            try
            {
                string content = "";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://tik.pp.ua/temp/file_post.php");
                request.Timeout = 30000;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = postByte.Length;
                using (Stream receiveStream = request.GetRequestStream())
                {
                    receiveStream.Write(postByte, 0, postByte.Length);
                    receiveStream.Close();
                    using (WebResponse response = request.GetResponse())
                    {
                        using (Stream receiveStream2 = response.GetResponseStream())
                        {
                            receiveStream2.ReadTimeout = 30000;
                            receiveStream2.WriteTimeout = 30000;
                            using (StreamReader readStream = new StreamReader(receiveStream2, Encoding.Default))
                            {
                                content = readStream.ReadToEnd();
                                readStream.Close();
                            }
                        }
                        response.Close();
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("SendInfo Exception: " + e.Message);
            }
        }
    }
}
Вот таким PHP-скриптом я пытаюсь принять содержимое файла и сохранить его на сервере:
PHP
1
2
3
4
5
6
7
8
9
10
<?php
$f = fopen('file_post.png',"w");
fwrite($f,$_POST['file']);
fclose($f);
 
$f = fopen('file_post.txt',"w");
fwrite($f,"winname: ".$_POST['winname']."\n");
fwrite($f,"next_time: ".$_POST['next_time']."\n");
fclose($f);
?>
В результате вместо нормальной PNG-картинки получается что-то непонятное и изуродованное У нее даже размер на половину меньше, чем у оригинальной картинки.
Хотя другие данные, отправленные в пост-запросе, передаются нормально (файл file_post.txt).

Помогите пожалуйста, как мне передать файл вместе с другими данными. А то я в инете находил только примеры как закодировать файл в URL-строку без всяких дополнительных тектовых полей. А мне нужно также текстовые поля передать.
Вложения
Тип файла: zip HttpPostFile.zip (26.2 Кб, 24 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2012, 09:46
Ответы с готовыми решениями:

Как можно передать переменные в файл php по ссылке методом POST?
Есть ajax элемент на странице. В файле-обработчике есть такие строки: if($_POST &amp;&amp; $_POST &amp;&amp; $_POST == 'update'){ $arFields...

Как передать с кнопки методом POST?
Прописал так &lt;?= Html::a('Удалить таск', ], ,'confirm' =&gt; 'Are you sure you want to delete this item?',]])?&gt; ...

Как передать ip адрес методом post?
Всем доброго времени суток. Из базы данных достал ip адрес. теперь его надо передать ajax ом в скрипт php: $.ajax({ type:...

9
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
22.04.2012, 23:21  [ТС]
ауу.. ну помогите же((
0
774 / 554 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
23.04.2012, 00:46
Для отправки файлов у запроса тип контента должен быть указан как multipart/form-data
и данные должны быть сформированы соответствующим способом
C#
1
request.ContentType = "multipart/form-data; boundary=23281168279961";
http://ru.wikipedia.org/wiki/Multipart_form-data
1
4 / 4 / 0
Регистрация: 23.04.2012
Сообщений: 6
24.04.2012, 09:39
А обязательно нужно именно всё это в текст адрес запроса впихнуть? Когда мне нужно было сделать подобную задачу, создал свой класс, завернул его в xml, а потом передал в качества параметра post-запроса. Если не разберетесь, могу скинуть пример
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
10.05.2012, 07:24  [ТС]
Цитата Сообщение от vasya-serega Посмотреть сообщение
Если не разберетесь, могу скинуть пример
Пожалуйста скиньте, если не тяжело
0
4 / 4 / 0
Регистрация: 23.04.2012
Сообщений: 6
09.06.2012, 17:41
Черт, на мыло ничего не приходило, не видел ваше сообщение. Вроде и подписка включена. Поищу в исходниках, если сегодня не найду, значит на работе осталось, в понедельник скину.
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
09.06.2012, 23:17  [ТС]
vasya-serega, спасибо! Эта тема с передачей файлов для меня не срочная, потому до сих пор актуальная, так что время для меня не страшное
0
4 / 4 / 0
Регистрация: 23.04.2012
Сообщений: 6
10.06.2012, 00:24
Ну как-то так

Функция отправки сообщения
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 void SendToService(DateTime time, byte[] image)
        {
            string baseAddress = "http://" + "server_name" + ":8001/";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseAddress + "PostData");
            req.Method = "POST";
            req.ContentType = "application/xml";
 
            XmlSerializer serializer = new XmlSerializer(typeof(TransferData));
            TransferData data = new TransferData();
            data.Time = time;
            data.Data = image;
            MemoryStream ms = new MemoryStream();
            serializer.Serialize(ms, data);
            var bytes = ms.ToArray();
            ms.Close();
            req.ContentLength = bytes.Length;
 
            //write xml into request stream
            var requestStream = req.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            //extract resposne result
            var responseStream = req.GetResponse().GetResponseStream();
            StreamReader sr = new StreamReader(responseStream);
            Console.WriteLine(sr.ReadToEnd());
            sr.Close();
            responseStream.Close();
        }
где TransferData - вот такой вот класс:
C#
1
2
3
4
5
 public class TransferData
    {
        public DateTime Time { get; set; }
        public byte[] Data { get; set; }
    }
Принимаем на сервере
C#
1
2
3
4
5
6
7
8
9
static void Main(string[] args)
        {
            WebServiceHost host = new WebServiceHost(typeof(Service1));
            host.Open();
            Console.WriteLine("Service is running");
            Console.WriteLine("Press enter to quit...");
            Console.ReadLine();
            host.Close();
        }
где Service1 - такой класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public class Service1 : IService1
    {
        public string PostData(TransferData data)
        {
            try
            {
                Console.WriteLine("Data is accepted");
                Console.WriteLine(data.Time.ToShortTimeString());
                Console.WriteLine(data.Data.Length);
                SaveFile(data.Data);
                return "Data is accepted";
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return ex.Message;
            }
        }
и интерфейс
C#
1
2
3
4
5
6
7
8
[ServiceContract]
    [XmlSerializerFormat]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(ResponseFormat = WebMessageFormat.Xml)]
        string PostData(TransferData data);
    }
А вот теперь самое интересное. Что-бы это всё работало, нужен конфиг файл. Это вроде понятно, но в нем Binding должен быть webHttpBinding. Только с ним удалось установить параметр maxReceivedMessageSize до приемлемого значения так, чтобы это всё действительно заработало. Иначе большой объем данных не передавался и появлялась ошибка. Содержимое App.config
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors />
        <bindings>
            <webHttpBinding>
                <binding name="NewBinding2" maxBufferSize="655360" maxBufferPoolSize="5242880"
                    maxReceivedMessageSize="655360" />
            </webHttpBinding>
        </bindings>
        <services>
            <service name="WcfService.Service1">
                <endpoint address="http://localhost:8001" behaviorConfiguration=""
                    binding="webHttpBinding" bindingConfiguration="NewBinding2"
                    contract="WcfService.IService1" />
            </service>
        </services>
    </system.serviceModel>
</configuration>
Еще один момент. В интерфейсе IService1 значение атрибута WebInvoke должно быть [WebInvoke(ResponseFormat = WebMessageFormat.Xml). Иначе работать не будет.
2
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
10.06.2012, 02:15  [ТС]
vasya-serega, спасибо большое!!! Буду разбираться)
0
4 / 4 / 0
Регистрация: 23.04.2012
Сообщений: 6
10.06.2012, 02:27
Удачи, у меня на это ушло дня 4. Жаль только что не пригодилось для применения на практике, зато что-то новое осваивать всегда классно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.06.2012, 02:27
Помогаю со студенческими работами здесь

Как передать 2 параметра методом POST из select?
Добрый вечер дорогие форумчане,столкнулся с проблемой передачи 2-х параметров через select тоесть: есть название категории товара и есть ее...

Как передать нажатие на ссылку методом post
Раньше была кнопка при нажатие на которую переменная $sec, передавалась на другую страницу теперь у меня ссылки,сделать тоже самое я...

Как передать массив из скрипта в скрипт методом POST
В файле parts.php есть форма &lt;form action=&quot;search_parts.php&quot; method=&quot;POST&quot;&gt; &lt;input type=&quot;text&quot; name=&quot;article&quot; size=&quot;27&quot;&gt; ...

Как передать id сообщения методом post на его удаление?
Здравстуйте. У меня есть форма, куда циклом из бд подгружаются сообщения пользователю. Нужно, чтобы под каждым сообщением была...

Php как передать 2 параметра методом POST из select
Что то вроде этого , я правильно понимаю? &lt;label&gt; &lt;span&gt;Автор:&lt;/span&gt; &lt;select name=&quot;autor_ID&quot; id=&quot;autor_ID&quot;&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru