Загрузка файла, но отправка сообщения для его инициализации
У меня есть кнопка на странице с ONCLICK, которую я динамически устанавливаю с помощью Jquery.
Эта кнопка запускает загрузку файла. Я использую mod_rewrite, чтобы включить http://somesite.com/blah1/blah2/blah3/blah4 в index.php&q=$1
Затем я обращаюсь к q, разделяю / и получаю любой запрошенный пользователем путь в виде массива.
Отлично работает, за исключением того, что я не могу отправить закодированный путь в качестве одной из своих переменных:
<?php
$html = '<button onClick="window.location = \'' . SITE_URL . 'downloadLog/' . urlencode($some_path) . ">Click me</button>';
Посмотрел на AllowEncodedSlashes для Apache.
Попробовал.. Всегда в конечном итоге либо %2fvar%2fadm%2FMESSAGES даже после urldecode() или rawurldecode(), либо apache пытается отправиться куда-то, чего не существует, даже если мой mod_rewrite включен/преобразует их в q=.
Итак... новая идея заключается в том, что я просто создам форму onClick и отправлю ее. У POST не будет проблем с моим URL-адресом в качестве параметра.
Так как это предназначено для onClick, и мой onClick= использует двойные кавычки (это часть еще одного огромного фрагмента кода, который я не могу легко меняйся прямо сейчас) Я думаю, что у меня возникли проблемы с правильным выбором побега. Сломался и не использовал кавычки вокруг моего удостоверения личности/имени в качестве последнего средства, все еще без костей.
Итак, вот что я придумал. Это не ошибка в firebug, но я также не вижу, чтобы сообщение происходило.
function get_inline_post($a) {
$output .= 'this_form = $(\'<form submit=' . SITE_URL . $a['submit'] . ' ></form>\').html(\'\')';
unset($a['submit']);
foreach ( $a as $key => $value ) {
$output .= '.append(\'<input id=' . $key . ' name=' . $key . ' type=hidden>\')';
}
$output .= ';';
foreach ($a as $key => $value ) {
$output .= '$(\'#' . $key . '\').val(\'' . rawurlencode($value) . '\');';
}
$output .= 'this_form.submit();';
return $output;
}
Который с учетом правильных переменных в конечном итоге создает это, чтобы перейти в мой onClick:
<button class="ui-corner-all"
onClick="
this_form = $('<form submit=/downloadHostLog/messages></form>').html('').append('<input id=link_hcmdb_id name=link_hcmdb_id type=hidden >').append('<input id=added_path name=added_path type=hidden >');
$('#link_hcmdb_id').val('046345D4771C4D3FBD2EF33CBE038028');$('#added_path').val('var%2Fadm');this_form.submit();
"
title="Kill me now" type="button">
<span class="ui-icon ui-icon-copy"></span>
</button>
Помните, я пытаюсь запустить загрузку здесь, поэтому ответы с помощью .post() бесполезны. Благодарю ты.
Редактировать:
Я открыт для использования оригинальной идеи простого кодирования URL-адреса в окне.сценарий местоположения, но я уже потратил на него весь день. На самом деле сделал таблицу и перепробовал все варианты:
кодирование с одним URL-адресом, кодирование с двойным URL-адресом, разные уровни кодирования, входящие и исходящие.
rawurlencode против urlencode,
Включение/выключение кодированных косых черт
На данный момент я предполагаю, что моя комбинация использования mod_rewrite, разделения на /для создания исходный путь запроса в виде массива и косые черты allowencoded могут просто не работать вместе.
Я также исключаю тот факт, что кнопки отправляются пользователю через ajax, и эта кнопка фактически оказывается в jqgrid. Это одна из причин, по которой я хочу просто встроить onClick в генерацию вместо того, чтобы делать
$().click(function(){blah});
Для каждой отдельной строки результатов, поскольку каждая строка имеет 5 различных параметров, отличных от того, что я показываю здесь, которые уникальны для каждой строки в целях безопасности... так что я в конечном итоге в любом случае, вызов привязки 50-500 раз, что было мучительно медленно.
То, что я делал ранее, было просто созданием идентификатора uid для каждой строки, сохранением его в переменной сеанса и разыменованием его обратно, когда пользователь посещал /Журнал загрузки/UID. Это тоже сработало, но мне нравится хранить информацию о сеансе под 4k по соображениям производительности, и для этого мне легко хватило 16k.
Просто заменив /на| перед кодировкой и изменив его обратно после работы, но я отказался прибегать к строить в таком жучке.
РЕДАКТИРОВАТЬ: @dqhendricks Мой текущий оператор mod_rewrite:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)? index.php?q=$1 [L,QSA]
Соответствующий php, который обрабатывает, что:
foreach ( preg_split('/\//',$_GET['q']) as $key => $value)
{
$g[$key] = urldecode($value);
}
Учитывая вышесказанное, я пробовал включать и выключать кодированные косые черты. Ни один из них не позволил /бла/бла/%2F%var%2fadmin/бла даже быть направленным в index.php . Получил 404.
1 answers
Не цитируйте меня по этому поводу, но я считаю, что такие фреймворки, как Zend, просто перенаправляют все на index.php (без переменных запроса GET), затем получает данные запроса от чего-то вроде $_SERVER['ORIG_PATH_INFO']*. Это дает вам данные запроса до декодирования URL-адреса. Затем вы можете разделить строку запроса и самостоятельно декодировать каждую переменную.
*Точно не уверен, но что-то вроде этого. Для уверенности придется заглянуть в класс маршрутизации Zend Framework.
РЕДАКТИРОВАТЬ
Выкопанный вверх по коду, который получает uri запроса от zend framework. Часть класса Zend_Controller_Request_Http, но вы поняли идею.
public function setRequestUri($requestUri = null)
{
if ($requestUri === null) {
if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch
$requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
} elseif (
// IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem)
isset($_SERVER['IIS_WasUrlRewritten'])
&& $_SERVER['IIS_WasUrlRewritten'] == '1'
&& isset($_SERVER['UNENCODED_URL'])
&& $_SERVER['UNENCODED_URL'] != ''
) {
$requestUri = $_SERVER['UNENCODED_URL'];
} elseif (isset($_SERVER['REQUEST_URI'])) {
$requestUri = $_SERVER['REQUEST_URI'];
// Http proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path
$schemeAndHttpHost = $this->getScheme() . '://' . $this->getHttpHost();
if (strpos($requestUri, $schemeAndHttpHost) === 0) {
$requestUri = substr($requestUri, strlen($schemeAndHttpHost));
}
} elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI
$requestUri = $_SERVER['ORIG_PATH_INFO'];
if (!empty($_SERVER['QUERY_STRING'])) {
$requestUri .= '?' . $_SERVER['QUERY_STRING'];
}
} else {
return $this;
}
} elseif (!is_string($requestUri)) {
return $this;
} else {
// Set GET items, if available
if (false !== ($pos = strpos($requestUri, '?'))) {
// Get key => value pairs and set $_GET
$query = substr($requestUri, $pos + 1);
parse_str($query, $vars);
$this->setQuery($vars);
}
}
$this->_requestUri = $requestUri;
return $this;
}