Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: POST Content-Type: application/octet-stream

На сайте есть ajax framework посылающий ПОСТ запросы с "Content-Type: application/octet-stream".

После перехода на пхп7 скрипт перестал парсить эти запросы в $_POST. Т.е. если залезть через "php://input", то там все есть, но $_POST - пуст.
Если те же данные посылать с "application/x-www-form-urlencoded", то все парсится нормально.

Кто-нить знает как это лечится ? Гугл не помог :(
Ответ:
либо читать маны, как правильно работать с этим фреймворком, либо (если установка заголовков там не возможна) выкинуть на помойку этот кривой инструмент :)
Вопрос: TIDHTTP отправка файла с Русским именем

НАРОД, ПОМОГИТЕ. ВЕСЬ ИНЕТ ПЕРЕРЫЛ

Проблема следующая:
отправляю post запрос через TIdHttp, в Post-запросе файл c русским названием, где-то по пути ломается название.

было: Тgffgекстовка.txt
стало: =?KOI8-R?B?9GdmZmfFy9PUz9fLwS50eHQ=?=

результат Http Analizer:

----------122415134445042
Content-Disposition: form-data; name="document_type"
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

8
----------122415134445042
Content-Disposition: form-data; name="document_file"; filename="=?KOI8-R?B?9GdmZmfFy9PUz9fLwS50eHQ=?="
Content-Type: application/octet-stream;
Content-Transfer-Encoding: binary

??????N????µ??N??°N???N?

----------122415134445042--

Часть процедуры отправки файла в сеть:

    lHTTP.Request.CustomHeaders.AddValue('X-CSRFToken', SERVEREXPLORER.IdCookieManager1.CookieCollection.Items[0].Value);
    lHTTP.Request.AcceptEncoding:='gzip, deflate';
    lHTTP.Request.AcceptCharSet:='utf-8';
    lHTTP.Response.ContentType := 'text/json; charset=utf-8';
    data.AddFormField('document_type', FileType, 'utf-8');
    data.AddFile('document_file', Тgffgекстовка.txt, 'application/octet-stream;');
    lHTTP.Post(aURL, data);

Вопрос, как сделать так, чтобы название файла не ломалось, а оставалось в юникоде.

Версия Indy: Indy Library 10.5.7
Сервер написан на Django.
Ответ:
НАРОД, ПОМОГИТЕ. ВЕСЬ ИНЕТ ПЕРЕРЫЛ

Проблема следующая:
отправляю post запрос через TIdHttp, в Post-запросе файл c русским названием, где-то по пути ломается название.

было: Тgffgекстовка.txt
стало: =?KOI8-R?B?9GdmZmfFy9PUz9fLwS50eHQ=?=

результат Http Analizer:

----------122415134445042
Content-Disposition: form-data; name="document_type"
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

8
----------122415134445042
Content-Disposition: form-data; name="document_file"; filename="=?KOI8-R?B?9GdmZmfFy9PUz9fLwS50eHQ=?="
Content-Type: application/octet-stream;
Content-Transfer-Encoding: binary

??????N????µ??N??°N???N?

----------122415134445042--

Часть процедуры отправки файла в сеть:

    lHTTP.Request.CustomHeaders.AddValue('X-CSRFToken', SERVEREXPLORER.IdCookieManager1.CookieCollection.Items[0].Value);
    lHTTP.Request.AcceptEncoding:='gzip, deflate';
    lHTTP.Request.AcceptCharSet:='utf-8';
    lHTTP.Response.ContentType := 'text/json; charset=utf-8';
    data.AddFormField('document_type', FileType, 'utf-8');
    data.AddFile('document_file', Тgffgекстовка.txt, 'application/octet-stream;');
    lHTTP.Post(aURL, data);

Вопрос, как сделать так, чтобы название файла не ломалось, а оставалось в юникоде.

Версия Indy: Indy Library 10.5.7
Сервер написан на Django.
Вопрос: Форма обратной связи с аттачем HTML+PHP

Здравствуйте форумчане! Пол дня пытаюсь разобраться с формой обратной связи с аттачем.. В php я ноль, но честно пытался сделать всё, что в моих силах.
Ситуация такова:
Форма отправляется успешно, только если файл прикреплен, хотя кажется должна отправляться и без него, и этого я не смог добиться как не старался..
Если отправить форму без файла, то выдает ошибку "Fatal error: Call to undefined function EMail() in /home/p357324/www/mysite.ru/contact3.php on line 56"
HTML:
HTML5
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
<section>
                                        <form method="post" action="contact3.php" enctype="multipart/form-data">
                                            <div class="row 50%">
                                                <div class="6u 12u(mobile)">
                                                    <input type="text" name="name" id="contact-name" maxlength="64" required placeholder="Ваше имя" x-autocompletetype="name"/>
                                                </div>
                                                <div class="6u 12u(mobile)">
                                                    <input type="text" name="from" id="contact-email" maxlength="64" required placeholder="Ваш Email" x-autocompletetype="name"/>
                                                </div>
                                            </div>
                                            <div class="row 50%">
                                                <div class="6u 12u(mobile)">
                                            <input type="file" name="file">
                                                </div>
                                            </div>
                                            <div class="row 50%">
                                                <div class="6u 12u(mobile)">
                                            <input type="text" name="subj" maxlength="64" required placeholder="Тема обращения" x-autocompletetype="name"/>
                                            </div>
                                            </div>
                                            <div class="row 50%">
                                                <div class="12u">
                                                    <textarea name="text" id="contact-message" required placeholder="Опишите Вашу ситуацию чтобы мы могли помочь." rows="6" x-autocompletetype="name"></textarea>
                                                </div>
                                            </div>
                                            <input name="bezspama" type="text" style="display:none" value="" />
                                            <div class="row">
                                                <div class="12u">
                                                    <ul class="actions">
                                                        <li><input type="submit" class="style1" value="Отправить" name="submit"/></li>
                                                        <li><input type="reset" class="style2" value="Reset" /></li>
                                                    </ul>
                                                </div>
                                            </div>
                                        </form>
                                    </section>
PHP:
PHP
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
<?
//Функция проверки переменной
function html_filter($str) {
    $result = HTMLSpecialChars($str);
    return $result;}
 
//Функция проверки e-mail
function isEmail($email){
    if (eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]+$", $email)){return TRUE;}else{return FALSE;}}
 
//Функция отправки письма с аттачем
$to = ("mymail@yandex.ru");
function XMail($from, $to, $subj, $text, $filename, $file)
{
$f         = fopen($file,"rb");
$un        = strtoupper(uniqid(time()));
$head      = "From: $from\n";
$head     .= "To: $to\n";
$head     .= "Subject: $subj\n";
$head     .= "X-Mailer: PHPMail Tool\n";
$head     .= "Reply-To: $from\n";
$head     .= "Mime-Version: 1.0\n";
$head     .= "Content-Type:multipart/mixed;";
$head     .= "boundary=\"----------".$un."\"\n\n";
$zag       = "------------".$un."\nContent-Type:text/html;\n";
$zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag      .= "------------".$un."\n";
$zag      .= "Content-Type: application/octet-stream;";
$zag      .= "name=\"".basename($filename)."\"\n";
$zag      .= "Content-Transfer-Encoding:base64\n";
$zag      .= "Content-Disposition:attachment;";
$zag      .= "filename=\"".basename($filename)."\"\n\n";
$zag      .= chunk_split(base64_encode(fread($f,filesize($file))))."\n";
if (!@mail("$to", "$subj", $zag, $head))
return 0;
else
return 1;
}
 
 
//Получаем данные из формы
if(isset($submit)):
//Проверяем полученные из формы данные
$from = trim(html_filter($from));
$to = trim(html_filter($to));
$subj = trim(html_filter($subj));
$text = trim(html_filter($text));
$text = str_replace("\n", "\n", $text);
$filename = trim(html_filter($file_name));
//Если прикреплен файл
if($filename!="" and $file_size>0):
    if(XMail($from, $to, $subj, $text, $filename, $file)==1){header("Location:?send=ok");}
endif;
//Если Не прикреплен файл
if($filename=="" or $file_size==0):
    if(EMail($from, $to, $subj, $text)==1){header("Location:?send=ok");}
endif;
endif;
?>
И если вам будет не сложно, то есть еще несколько вопросов:
1. При отправке формы, не проверяется корректность email, то есть в графе email можно написать и отправлять что угодно, а не , хотя кажется в обработчике присутствует проверка.. Как это исправить?
2. Когда форма отправляется, то я оказываюсь на странице contact.php, вот как сделать так, чтобы было просто сообщение "письмо отправлено", форма обнулялась и все? Либо на крайний случай, возвращать обратно на главную страницу после отправки формы. Пытался добавлять в конец кода:
PHP
1
header('Refresh: 5; URL=mysite.ru');
Но не помогло.
3. И последнее, подскажите пожалуйста, куда и что в php прописать, чтоб можно было отправлять только файлы определенного типа, например .jpg и больше ничего.
Буду безмерно благодарен всем, кто попытается помочь!
Ответ: Проблема решена, найден скрипт на ajax
Вдруг кому пригодится:
HTML5
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Форма обратной связи</title>
        <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
    </head>
    <body>
        <div style="color: red;" id="result"></div><br />
        <img src="ajax-loader.gif" id="load-indicator" alt="loading" style="position:absolute; z-index:1000; display:none;" />
 
        <h2>Форма обратной связи</h2>
        <form method="post" action="mails_sender.php" id="feedback" name="feedback" enctype="multipart/form-data">
            <table style="width: 100%">
                <tr>
                    <td style="width: 146px">Ваш e-mail</td>
                    <td><input name="youremail" type="text" style="width: 440px" size="20" /></td></tr>
                <tr>
                    <td style="width: 146px">Тема сообщения</td>
                    <td><input name="subject" type="text" style="width: 440px" size="20" /></td></tr>
                <tr>
                    <td>Опции для выбора:</td>
                    <td>
                        <select name="option" style="width: 440px">
                            <option style='color:#CCCCCC;'>- - Выберите из списка - -</option>
                            <option value="Опция 1">Опция 1</option>
                            <option value="Опция 1">Опция 2</option>
                            <option value="Опция 1">Опция 3</option>
                        </select></td></tr>
                <tr>
                    <td style="width: 146px">Ваше сообщение</td>
                    <td>
                        <textarea name="message" style="width: 440px; height: 130px" rows="1" cols="20"></textarea></td></tr>
                <tr>
                    <td style="width: 146px">Ваше имя</td>
                    <td><input name="name" type="text" style="width: 440px" size="20" value="" /></td></tr>
 
                <tr>
                    <td style="width: 146px">Вы можете присоединить необходимые файлы</td>
                    <td><input name="fileforsending" type="file" style="width: 440px" /></td></tr>
                <tr>
                    <td style="width: 146px">&nbsp;</td>
                    <td><br />
                        <input name="Reset1" type="reset" value="Очистить" style="width: 97px" />
                        <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                            <input name="Submit1" type="submit" value="Отправить" style="width: 157px" />
                            &nbsp; </span>
                    </td></tr>
            </table>
        </form>
 
        <script>
            // этот участок кода нужен только для отображения гифки
            // которая даёт пользователю понять, что что-то происходит
            // и нужно подождать
            $(document).ready(function () {
                $(document).ajaxStart(function () {
                    // найдем элемент с изображением загрузки и уберем невидимость:
                    var imgObj = $("#load-indicator");
                    imgObj.show();
                    // вычислим в какие координаты нужно поместить изображение загрузки,
                    // чтобы оно оказалось в серидине страницы:
                    var centerY = $(window).scrollTop() + ($(window).height() + imgObj.height()) / 2;
                    var centerX = $(window).scrollLeft() + ($(window).width() + imgObj.width()) / 2;
                    imgObj.offset({
                        left: centerX,
                        top: centerY
                    });
                });
                //скрываем изображение после окончания AJAX-запроса
                $(document).ajaxStop(function () {
                    $('#load-indicator').hide();
                });
            });
 
            // назначаем действие на такое событие как отправка формы
            $('#feedback').submit(function (evtObj) {
                evtObj.preventDefault();
                // Если элемент формы fileforsending содержит значения (т.е. выбран файл для отправки),
                // то вместо AJAX-запроса используем FormData()
                // поскольку файлы через AJAX-запросы не передаются                
 
                if (document.getElementById("feedback").fileforsending.value !== '') {
                    //показываем гифку ожидания
                    var imgObj = $("#load-indicator");
                    imgObj.show();
                    var centerY = $(window).scrollTop() + ($(window).height() + imgObj.height()) / 2;
                    var centerX = $(window).scrollLeft() + ($(window).width() + imgObj.width()) / 2;
                    imgObj.offset({
                        left: centerX,
                        top: centerY
                    });
                    // этот кусок кода я спёр отсюда http://javascript.ru/forum/jquery/40698-ajax-i-otpravka-fajjlov-s-formy.html
                    var form = document.forms.feedback;
                    var formData = new FormData(form);
                    var xhr = new XMLHttpRequest();
                    xhr.open("POST", "mails_sender.php");
                    xhr.onreadystatechange = function () {
                        if (xhr.readyState == 4) {
                            if (xhr.status == 200) {
                                data = xhr.responseText;
                                $("#result").html('Результат выполнения: ' + data);
                                // Письмо отправлено, сбрасываем данные формы если прошло успешно
                                if (data === 'Отправлено письмо с вложениями.') {
                                    document.getElementById("feedback").reset();
                                }
                                //убираем гифку ожидания
                                $('#load-indicator').hide();
                            }
                        }
                    };
                    xhr.send(formData);
                    // В противном случае (не прикреплён файл для отправки)
                    // Делаем AJAX-запрос для отправки письма
                } else {
                    var form = $(this);
                    $.ajax({
                        // Здесь файл, который обрабатывает полученные от пользователя данные и отправляет почту
                        url: 'mails_sender.php',
                        type: 'POST',
                        data: form.serialize(),
                        // Действия в случае успешной отправки AJAX-запроса (а не письма!)
                        // Здесь data - полученное от mails_sender.php сообщение
                        success: function (data) {
                            if (data === 'Отправлено письмо без вложений.') {
                                $("#result").html('Отправлено письмо без вложений.');
                                // Письмо отправлено, сбрасываем данные формы
                                document.getElementById("feedback").reset();
                                // Следующая строка после успешной отправки сообщения
                                // перенаправляет пользователь на любую страницу/сайт
                                // достаточно раскомментировать её и поменять адрес сайта webware.biz
                                // на ваш собственный
                                //document.location.href = 'http://webware.biz';
                            } else {
                                $("#result").html(data);
                            }
                        },
                        error: function (data) {
                            $("#result").html('Результат выполнения: ' + data);
                        }
                    });
                }
            });
        </script>
    </body>
</html>
PHP
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
 
// Адрес, куда отправляем письмо
$to = 'mial@localhost';
 
// Получаем данные от пользователя
// Все данные обязательно нужно проверять на правильность!
$userEmail = filter_input(INPUT_POST, 'youremail', FILTER_VALIDATE_EMAIL);
$subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$option = filter_input(INPUT_POST, 'option', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
$message = strip_tags(filter_input(INPUT_POST, 'message', FILTER_SANITIZE_MAGIC_QUOTES), '<p><a><b><div>');
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
 
// Проверка, что данные не пустые. 
// Нас не интересуют анонимки
if (empty($userEmail)) {
    die('Отсутствует или неверен адрес почты.');
// Нас не интересуют послания с пустым сообщением
} elseif (empty($message)) {
    die('Отсутствует сообщение.');
} elseif (empty($subject)) {
    $subject = '[тема не указана]';
}
 
$the_file = '';
//Если пользователь выбрал файл для отправки
if (!empty($_FILES['fileforsending']['tmp_name'])) {
    // Закачиваем файл
    $path = $_FILES['fileforsending']['name'];
    if (copy($_FILES['fileforsending']['tmp_name'], $path)) {
        $the_file = $path;
    }
}
// Если есть прикреплённый файл, то заголовки чуть другие.
// Поэтому, в зависимости от того, отправил ли пользователь файл,
// выбираем, что делать дальше
$headers = null;
 
if (empty($the_file)) {
    // эта часть кода отвечает за отправку сообщений без вложений
    // собираем заголовки
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "Content-type: text/html; charset=UTF-8";
    $headers[] = "From: $name <$userEmail>";
    $headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
    $headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: {$subject}";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    // собираем текст письма
    $allmsg = "<p><b>E-mail:</b> $userEmail</p>
        <p><b>Выбранная опция:</b> $option</p>
            <p><b>Сообщение:</b> $message</p>";
    $allmsg = "<html><head><title>Обратная связь</title><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\"></head><body>" . $allmsg . "</body></html>";
    // отправляем
    if (!mail($to, $subject, $allmsg, implode("\r\n", $headers))) {
        echo 'Письмо не отправлено - что-то не сработало.';
    } else {
        echo 'Отправлено письмо без вложений.';
    }
} else {
    // эта часть кода отвечает за отправку сообщений с вложениями
    // читаем отправляемый файл в строку
    $fp = fopen($the_file, "r");
    if (!$the_file) {
        die("Ошибка отправка письма: Файл $the_file не может быть прочитан.");
    }
    $file = fread($fp, filesize($path));
    fclose($fp);
    // удаляем временный файл
    unlink($path);
    // собираем текст письма
    $allmsg = "<p><b>E-mail:</b> $userEmail</p>
        <p><b>Выбранная опция:</b> $option</p>
            <p><b>Сообщение:</b> $message</p>";
    $allmsg = "<html><head><title>Обратная связь</title><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\"></head><body>" . $allmsg . "</body></html>";
    // генерируем разделитель
    $boundary = "--" . md5(uniqid(time()));
    // собираем заголовки
    $headers = array();
    $headers[] = "MIME-Version: 1.0";
    $headers[] = "From: $name <$userEmail>";
    $headers[] = "Bcc: JJ Chong <bcc@domain2.com>";
    $headers[] = "Reply-To: Recipient Name <receiver@domain3.com>";
    $headers[] = "Subject: {$subject}";
    $headers[] = "X-Mailer: PHP/" . phpversion();
    $headers[] = "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
    // собираем текст письма + приложенынй файл
    $multipart = array();
    $multipart[] = "--$boundary";
    $multipart[] = "Content-Type: text/html; charset=UTF-8";
    $multipart[] = "Content-Transfer-Encoding: Quot-Printed\r\n";
    $multipart[] = "$allmsg\r\n";
    $multipart[] = "--$boundary";
    $multipart[] = "Content-Type: application/octet-stream";
    $multipart[] = "Content-Transfer-Encoding: base64";
    $multipart[] = "Content-Disposition: attachment; filename = \"" . $path . "\"\r\n";
    $multipart[] = chunk_split(base64_encode($file));
    $multipart[] = "--$boundary";
    // отправляем
    if (!mail($to, $subject, implode("\r\n", $multipart), implode("\r\n", $headers))) {
        echo 'Письмо не отправлено - что-то не сработало.';
    } else {
        echo 'Отправлено письмо с вложениями.';
    }
}
Спасибо WhiteMind за ответы!
Вопрос: Readfile и архив

Товарищи, такая проблема - Нужно возвращать пользователю файлы отчетов. Выгрузка, грубо говоря, счета, общей накладной и накладной по складам.
При формировании счета (в PDF) и общей накладной (xls) проблем не возникает. Вот такая конструкция возвращает все корректно:
PHP
1
2
3
4
5
6
7
8
9
10
11
ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $ORDER . '.xls');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
 header('Cache-Control: must-revalidate');
header('Pragma: public');
            // читаем файл и отправляем его пользователю
readfile($uploadFolder . $ORDER . '.xls');
unlink($_SERVER['DOCUMENT_ROOT'] . 'upload/'. $ORDER . '.xls');
То же самое с pdf.
Однако, накладная по складам состоит из нескольких файлов, их я формирую в архив. Архив на сервере лежит нормальный, открывается корректно. Но readfile возвращает битый трехкилобайтный архив. В чем может быть беда?
З.Ы. вот код, который возвращает архив:
PHP
1
2
3
4
5
6
7
8
9
10
$zip->close();
ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="stores.zip"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile($uploadFolder . 'stores.zip');
Ответ: что покажет
PHP
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
90
91
92
93
94
95
96
97
98
99
100
101
102
<?  
loadExtClass('PHPExcel');
loadClass('Basket');
loadClass('Product');
loadClass('Store');
 
$BASKET = Basket::getBasketList($BASKET_ID);
PHPExcel::init();
$zip = new ZipArchive();
 
$upload = '*dir*';
$fileName = 'stores_'.$ORDER.'_'.time().'.zip';
//$zip->open($upload.'stores.zip', ZIPARCHIVE::CREATE);
//if ($zip->open($_SERVER['DOCUMENT_ROOT'] . '/upload/' . $fileName, ZipArchive::CREATE)!==TRUE) {
$uploadTmpFileName = 'sk-se-wq-qw-sa-stores.zip';
if ($zip->open( $uploadTmpFileName , ZipArchive::CREATE)!==TRUE) {
    exit("Невозможно открыть файл\n");
}
 
$IDS = array();
 
foreach($BASKET as $item)
    $IDS[] = $item['ID_PRODUCT'];
$IDS = implode(',', $IDS);
 
$DB = SQL::get_instance();
 
$res = $DB->query(
    'select max(s.ID), s.NAME
    from gxvg_storage as s
    LEFT JOIN gxvg_prod2stor as p2s ON p2s.ID_STOR = s.ID
    LEFT JOIN gxvg_products as p ON p2s.ID_PROD = p.ID
    WHERE p2s.QUANTITY > 0 AND p.ID IN ('. $IDS .')
    GROUP BY s.NAME'
);
 
$result = $res->fetchAll();
 
$names = array();
foreach ($result as $key => $value) {
    $products = Basket::getBasketListByStore($value['max(s.ID)'], $BASKET_ID);
 
    $xls = new PHPExcel();
    // Устанавливаем индекс активного листа
    $xls->setActiveSheetIndex(0);
    // Получаем активный лист
    $sheet = $xls->getActiveSheet();
    // Подписываем лист
    $sheet->setTitle('Товарный чек');
    $sheet->setCellValue("A1", 'Товарный чек №' . $ORDER . ' ('.$value['NAME'].')');
 
    $sheet->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
 
    $sheet->mergeCells('A1:H1');
 
    $sheet->setCellValue("A3", '№');
    $sheet->setCellValue("B3", 'Наименование');
    $sheet->setCellValue("C3", 'Артикул');
    $sheet->setCellValue("D3", 'Штрихкод');
    $sheet->setCellValue("E3", 'Количество');
    $sheet->setCellValue("F3", 'Остаток по сайту');
    $sheet->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
 
    $sheet->getStyle('A3:G3')->getFont()->setBold(true);
 
    $i = 4;
    $j = 1;
 
    foreach ($products as $item) {
        $sheet->setCellValue("A$i", $j++);
        $sheet->setCellValue("B$i", $item['PRODUCT_NAME']);
        $sheet->setCellValue("C$i", $item['ARTICLE']);
        $sheet->setCellValue("D$i", $item['BARCODE']);
        $sheet->setCellValue("E$i", $item['QUANTITY']);
        $sheet->setCellValue("F$i", $item['TOTAL_QUANTITY']);
        $i++;
    }
    $sheet->getColumnDimension('A')->setAutoSize(true);
    $sheet->getColumnDimension('B')->setAutoSize(true);
    $sheet->getColumnDimension('C')->setAutoSize(true);
    $sheet->getColumnDimension('D')->setAutoSize(true);
    $sheet->getColumnDimension('E')->setAutoSize(true);
    $sheet->getColumnDimension('F')->setAutoSize(true);
    $objWriter = new PHPExcel_Writer_Excel5($xls);
    $objWriter->save($_SERVER['DOCUMENT_ROOT'] . '/upload/'. $ORDER . '_' . $value['NAME'] . '.xls');
 
    $zip->addFile($_SERVER['DOCUMENT_ROOT'] . '/upload/'. $ORDER . '_' . $value['NAME'] . '.xls', $ORDER . '_' . $value['NAME'] . '.xls');
    $names[] = $ORDER . '_' . $value['NAME'];
}
 
$zip->close();
ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="stores.zip"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public'); 
//readfile($upload . 'stores.zip');
readfile( $uploadTmpFileName );
?>
Вопрос: Файл в базе SQL

Всем привет!

Есть БД , в ней столбец file_data с содержимым вида 0x78DAED7многоРазныхСимволов.

Знаю, что это doc файлы, другой инфы нет.
Как их слить с помощью PHP?

делаю так

$query = "SELECT file_data FROM table WHERE id_document = 20"; 
$result = sqlsrv_query( $conn, $query ); 
 
list($id, $id_document, $file_name, $file_data) = sqlsrv_fetch_array($result); 
 
header("Content-Disposition: attachment; filename=$file_name"); 
   
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Description: File Transfer");  
//echo base64_encode($file_data); 
echo ($file_data); 


файл скачивается и имеет размер, похожий на правду, но в содержимом иероглифы, либо наборы символов

QkglF33+B0z9n3fl1AkZM1uLKFIQtEi



xЪн}]чш 3ц}Я—P$dНn,ЎHBС" e§И–-ЩЉJZ( ERIRТЫfR
Ответ: Макбет, vkle,

1. разве не эти заголовки указывают на скачивание файла?
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");


readfile $file_data это?


2. пробовал такие варианты
echo base64_encode($file_data);
echo base64_decode($file_data);
echo($file_data);
Вопрос: Отправить браузеру html и файл одновременно

Немного потерялся на вашем сайте, не сразу нашел подходящий раздел для вопроса.
Суть проблемы.
Делаю тестовое задание, сервер отправляющий по запросу браузера файл.
Запрос вида
Если файла нет, то все просто, отправляю html с ошибкой.
Если файл есть то нужно (возможно ли?) отправить html с информацией о начавшейся загрузке и сам файл.
Для отправки файла конструирую такой хедер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::string headerFile(const std::string& filename, int contentLength)
    {
        std::string h =
        "HTTP/1.1 200 OK\r\n"
        "Content-Description: File Transfer\n"
        "Content-Type: application/octet-stream\n"
        "Content-Disposition: attachment; filename="+filename+"\n"
        "Content-Transfer-Encoding: binary\n"
        "Expires: 0\n"
        "Cache-Control: must-revalidate\n"
        "Pragma: public\n"
        "Content-Length: " + boost::lexical_cast<std::string>(contentLength) + "\n"
        "\n";
 
        return h;
 
    }
Проблема в том, что после получения первого хедера, всё остальное воспринимается браузером, как данные и не понятно как ему подсунуть простенький html для отображения в окне.
Буду благодарен за любую подсказку
Ответ:
Сообщение от maxmail
C++
1
2
3
4
5
6
7
* * * * "HTTP/1.1 200 OK\r\n"
* * * * "Content-Description: File Transfer\n"
* * * * "Content-Type: application/octet-stream\n"
* * * * "Content-Disposition: attachment; filename="+filename+"\n"
* * * * "Content-Transfer-Encoding: binary\n"
* * * * "Expires: 0\n"
* * * * "Cache-Control: must-revalidate\n"
maxmail, разделить между заголовками должен быть \r\n, а не \n.
Вопрос: TIdHttp и Post в KOI8-Ru

Проблема следующая:
отправляю post запрос через TIdHttp, в Post-запросе файл c русским названием, где-то по пути ломается название.

было: Тgffgекстовка.txt
стало: =?KOI8-R?B?9GdmZmfFy9PUz9fLwS50eHQ=?=

результат Http Analizer

----------122415134445042
Content-Disposition: form-data; name="document_type"
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

8
----------122415134445042
Content-Disposition: form-data; name="document_file"; filename="=?KOI8-R?B?9GdmZmfFy9PUz9fLwS50eHQ=?="
Content-Type: application/octet-stream;
Content-Transfer-Encoding: binary

??????N????µ??N??°N???N?

----------122415134445042--

Часть процедуры отправки файла в сеть
Delphi
1
2
3
4
5
6
7
    lHTTP.Request.CustomHeaders.AddValue('X-CSRFToken', SERVEREXPLORER.IdCookieManager1.CookieCollection.Items[0].Value);
    lHTTP.Request.AcceptEncoding:='gzip, deflate';
    lHTTP.Request.AcceptCharSet:='utf-8';
    lHTTP.Response.ContentType := 'text/json; charset=utf-8';
    data.AddFormField('document_type', FileType, 'utf-8');
    data.AddFile('document_file', Тgffgекстовка.txt, 'application/octet-stream;');
    lHTTP.Post(aURL, data);
Вопрос, как сделать так, чтобы название файла не ломалось, а оставалось в юникоде.

Сервер написан на Django.
Ответ: вот то что показывает HTTP Analizer
Вопрос: Передача файла на сервер методом POST

Потолок: .Net 4.0
Идея: передать файл методом POST на сервер скрипту.
Что есть:
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
90
91
        public string ZAGPyZKA_FAiLA(string FAiL, string id0, string DELO = "BblPBu_GLAZ_PyLuT")
        {
            //Дело - картинка объявления.
            // 1
            string GOPOD = _HACTPOiKu["GOPOD"];
            string ATU = "GOPOD=" + GOPOD + "|email="+ _HACTPOiKu["email"] +"|id="+ id0 + "|DELO=" + DELO;
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("------WebKitFormBoundaryFQyoiBAmgWBjjIyg");
            sb.AppendLine("Content-Disposition: form-data; name="X-Client-Version"");
            sb.AppendLine("");
            sb.AppendLine("");
            sb.AppendLine("1.0.00");
            sb.AppendLine("------WebKitFormBoundaryFQyoiBAmgWBjjIyg");
            sb.AppendLine("Content-Disposition: form-data; name="X-Client-Type"");
            sb.AppendLine("");
            sb.AppendLine("API");
            sb.AppendLine("------WebKitFormBoundaryFQyoiBAmgWBjjIyg");
            sb.AppendLine("Content-Disposition: form-data; name="X-Api-Version"");
            sb.AppendLine("");
            sb.AppendLine("1.0");
            sb.AppendLine("------WebKitFormBoundaryFQyoiBAmgWBjjIyg");
            sb.AppendLine("Content-Disposition: form-data; name="X-Authorization"");
            sb.AppendLine("");
            sb.AppendLine(ATU);
            sb.AppendLine("");
            sb.AppendLine("------WebKitFormBoundaryFQyoiBAmgWBjjIyg");
            sb.AppendLine("Content-Disposition: form-data; name="Accept"");
            sb.AppendLine("");
            sb.AppendLine("application/json");
            sb.AppendLine("------WebKitFormBoundaryFQyoiBAmgWBjjIyg");
            sb.AppendLine("Content-Disposition: form-data; name="KAPTuHKA"; filename="" + System.IO.Path.GetFileName(FAiL) + """);
            //sb.AppendLine("Content-Type: application/octet-stream");
            sb.AppendLine("Content-Type: image/"+ System.IO.Path.GetExtension(FAiL));
            sb.AppendLine("");
 
            byte[] nach = Encoding.ASCII.GetBytes(sb.ToString());
            byte[] str = File.ReadAllBytes(FAiL);
            byte[] stri = Encoding.ASCII.GetBytes(Environment.NewLine);
            byte[] str2 = Encoding.ASCII.GetBytes("------WebKitFormBoundaryFQyoiBAmgWBjjIyg--");
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_HACTPOiKu["CKPunT"]);
            request.CookieContainer = new CookieContainer();
            request.Accept = "application/json";
            request.ServicePoint.Expect100Continue = false;
            request.Referer = "http://ya.ru";
            request.ContentType = "multipart/form-data; boundary=----WebKitFormBoundaryFQyoiBAmgWBjjIyg";
            request.UserAgent = " Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36";
            request.AllowAutoRedirect = true;
            //  request.Proxy = new WebProxy("84.27.75.236:39460");
            request.Host = _HACTPOiKu["CAiT"];
            request.KeepAlive = true;
            
            request.TransferEncoding = "";
 
            request.Headers.Add("X-Requested-With: XMLHttpRequest");
            request.Headers.Add("X-Api-Version: 1.0");
            request.Headers.Add("X-Client-Version: 1.0.00");
            request.Headers.Add("X-Authorization: " + ATU);
            request.Headers.Add("X-Client-Type: API");
            request.Headers.Add("Accept-Encoding: gzip,deflate,sdch");
            request.Headers.Add("Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
            
            request.Method = "POST";
 
            request.ContentLength = nach.Length + str.Length + str2.Length + stri.Length;
            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(nach, 0, nach.Length);
                requestStream.Write(str, 0, str.Length);
                requestStream.Write(stri, 0, stri.Length);
                requestStream.Write(str2, 0, str2.Length);
                requestStream.Close();
            }
            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
                    if (response.Cookies != null)
                    {
                        //Cooks.Add(response.Cookies);
                    }
                    var s = request.GetResponse();
                    //return getLink(System.IO.Path.GetFileName(FAiL));
                    return (FAiL);
                }
            }
            catch (WebException e)
            {
                return "" + e;
            }
}
Затруднение: я не знаю почему картинку мой скрипт(на PHP) на сервере, не ложит в директорию(что в нём указано) картинку, что я ему сую. Да и как вообще узнать: что мой скрипт ответил на запрос закачки картинки?
Смотрел:
var s = request.GetResponse();
- ненашёл строки "что выплёвывает мой скрипт". Что мне надо смотреть?

П.с.: ещё вопрос: как передать в переменной "ATU" русские буквы так, чтобы они передавались на сервер. У меня ругается "не допустимые символы"?

Добавлено через 27 минут
Если имеет значение: на сервере, массивы $_SERVER и $_FILES не пустые(в них инфа об соединении с свервером). Т.е. файл на сервер попадает.

Добавлено через 19 часов 37 минут
Что? Нет возможности узнать "что мне скрипт ответил на попытку закачать файл"?

Добавлено через 34 секунды
Может я выбрал(нашёл) неправильный способ реализации?
Ответ:

Не по теме:

47911, тебя прёт, что ли, таким стилем сущности именовать?

Вопрос: Indy10 TIdAttachmentFile вложение не происходит

Доброе время суток уважаемые!
перелопатил почти весь интернет, но решения своих проблем не нашел.
1. Проблема отправки файлов
Отправляю файл из программы с компонентом idSMTP, idMessage.

IdSMTP1.Host:='127.0.0.1'; //локальный почтовый сервер
  IdSMTP1.Port:=25;
  IdMessage1.ContentType:='text/plain';
  IdMessage1.CharSet:='Windows-1251';
  IdMessage1.Encoding:=meMIME;
  IdMessage1.Subject:='Тема';
  IdMessage1.Body.text:=Memo1.text;
  IdMessage1.From.Address:='adress@localhost.loc';
  IdMessage1.Recipients.EMailAddresses:='test@mail.ru';
  TIdAttachmentFile.Create(IdMessage1.MessageParts, dir+'\bases.abs');
  try
    IdSMTP1.Connect();
    IdSMTP1.Send(IdMessage1);
    showmessage('Сообщение отправлено!!!');
  except
    showmessage('Ошибка!');
  end;
 
  IdSMTP1.Disconnect;

в итоге письмо приходит,
+=Тело письма

Время отправки: 11.11.2015

--5ska2fUIMNUW2C=_jUZN8aft4rBPnnTUAq
Content-Type: application/octet-stream;
name="bases.abs"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="bases.abs"

QUJTMExVVEVEQVRBQkFTRUwAXI/C9ShcGEAAEAgAPgAAADsAAADrDAAAAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAABgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Что я делаю не так? танцы с бубном уже длятся неделю (((
Ответ:
IndyForum
Тебе сюда:


Спасибо, получилось!

+

  IdSMTP1.Host:='localhost';
  IdSMTP1.Port:=StrToInt('25');
  IdSMTP1.ConnectTimeout:=10000;
  IdSMTP1.Connect;
  with IdMessage1 do
  begin
    From.Text:='admin@127.0.0.1';
    ReplyTo.EMailAddresses := 'admin@127.0.0.1';
    Recipients.EMailAddresses := 'admin@127.0.0.1';
    ReceiptRecipient.Text := '';
    MessageParts.Clear;
    body.add('111');
    with TIdAttachmentFile.Create(IdMessage1.MessageParts, dir+'\bases.abs') do begin
      ContentType := 'application/octet-stream';
      FileName := 'bases.abs';
    end;
    Subject:= 'тест';
    IdMessage1.ContentType := 'multipart/mixed';
  end;



IdMessage1.ContentType := 'multipart/mixed'; - Нужно было все го лишь добавить эту строку

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

допилю до товарного вида, дочитаю доки, выложу сюда код сюда, авось кому нибудь пригодиться.

Большое спасибо всем откликнувшимся.
Вопрос: Почему форма отправки не отправляет данные?

PHP
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
<?php
$name = $_POST['name']; //ИМЯ
$name = htmlspecialchars($name);
$name = urldecode($name);
$name = trim($name);
 
$famel = $_POST['famel']; //ФАМИЛИЯ
$famel = htmlspecialchars($famel);
$famel = urldecode($famel);
$famel = trim($famel);
 
$oth = $_POST['oth']; //ОТЧЕСТВО
$oth = htmlspecialchars($oth);
$oth = urldecode($oth);
$oth = trim($oth);
 
 
$email = $_POST['email']; //ПОЧТА
$email = htmlspecialchars($email);
$email = urldecode($email);
$email = trim($email);
 
$phone = $_POST['phone']; //ТЕЛЕФОН
$phone = htmlspecialchars($phone);
$phone = urldecode($phone);
$phone = trim($phone);
 
 
  $filename = "project.doc"; //Имя файла для прикрепления
  $to = "мне@gmail.com"; //Кому
  $from = "отменя@webenot.ru"; //От кого
  $subject = "Заявка"; //Тема
  $message = .$name. .$famel. .$oth. .$email. $phone.; //Текст письма
  $boundary = "---"; //Разделитель
  /* Заголовки */
  $headers = "From: $from\nReply-To: $from\n";
  $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"";
  $body = "--$boundary\n";
  /* Присоединяем текстовое сообщение */
  $body .= "Content-type: text/html; charset='utf-8'\n";
  $body .= "Content-Transfer-Encoding: quoted-printablenn";
  $body .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode($filename)."?=\n\n";
  $body .= $message."\n";
  $body .= "--$boundary\n";
  $file = fopen($filename, "r"); //Открываем файл
  $text = fread($file, filesize($filename)); //Считываем весь файл
  fclose($file); //Закрываем файл
  /* Добавляем тип содержимого, кодируем текст файла и добавляем в тело письма */
  $body .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode($filename)."?=\n";
  $body .= "Content-Transfer-Encoding: base64\n";
  $body .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode($filename)."?=\n\n";
  $body .= chunk_split(base64_encode($text))."\n";
  $body .= "--".$boundary ."--\n";
  mail($to, $subject, $body, $headers); //Отправляем письмо
?>
Вот что мне пишет:
Warning: fopen(project.doc): failed to open stream: No such file or directory in /home/myidhost/public_html/post.php on line 45

Warning: filesize(): stat failed for brif.doc in /home/myidhost/public_html/post.php on line 46

Warning: fread() expects parameter 1 to be resource, boolean given in /home/myidhost/public_html/post.php on line 46

Warning: fclose() expects parameter 1 to be resource, boolean given in /home/myidhost/public_html/post.php on line 47
Ответ:
Сообщение от Jewbacabra
а в приведенном примере используется \n
Это хоть как-то можно объяснить: иногда в линухе нужно писать \n, чтобы в результате получилось \r\n. А вот это объяснить уже сложнее:
PHP
1
$body .= "Content-Transfer-Encoding: quoted-printablenn";
С экрана что ли переписывали?