[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как создать экземпляр класса в дочерней директории
skolozhabskiy
доброе утро,

прошу помощи с вопросом: как правильно создать/объявить экземпляр класса в файле дочерней директории?

вариант 1.

1. есть файл test.php с кодом загрузки файлов на сервер.
2. есть файл uploadfile.php с кодом класса загрузки в папке inc/uploadfile.php корневой директории
3. есть папка для разгрузки файлов в image/upload/ корневой директории

- код файла uploadfile.php примерно такой:

class UploadFile {
public $field_name;
public $stored_file_name;
public $original_file_name;
public $temp_file_location;

function get_url($stored_file_name,$bean_id) {

}


и так далее


- код файла tets.php примерно такой:

<?php
// Подключаем файл с классом
include_once('inc/uploadfile.php');
// создаем экземпляр класса
$file = new UploadFile('upload_file');

далее работаем с элементами класса и если все OK! и файл загружается в выделенную директорию, то имя файла $file_name записываем в базу данных:

mysql_query("UPDATE `my_table` SET `filename`='$file_name");
?>

<form enctype="multipart/form-data" method="POST">
<
input type="file" id="upload_input" name="upload_file" />
<
input type="submit" value="Загрузить файл" />
</
form>


Этот вариант работает отлично! все разгружается и имена файлов обновляются в таблице!

вариант 2.

из файла test.php код php переносим в файл ajax-test.php и помещаем его в директорию ajax/ajax-test.php.

- код файла ajax-test.php в папке ajax/:

<?php
// Подключаем файл с классом
include_once('../inc/uploadfile.php');
// создаем экземпляр класса
$file = new UploadFile('upload_file');

далее работаем с элементами класса и если все OK! и файл загружается в выделенную директорию, то имя файла $file_name записываем в базу данных:

mysql_query("UPDATE `my_table` SET `filename`='$file_name'");
?>


- код файла test.php теперь:

<form enctype="multipart/form-data" method="POST">
<
input type="file" id="upload_input" name="upload_file" />
<
input type="submit" value="Загрузить файл" />
</
form>

Этот вариант не работает, файлы не разгружаются!

я понимаю, что ошибка, вероятно, в строке файла ajax-test.php:

// создаем экземпляр класса
$file = new UploadFile('upload_file');

видимо экземпляр класса не видит объект 'upload_file' в файле дочерней директории (ajax/ajax-test.php) из файла test.php в корневой директории, но не могу понят как прописать так, чтобы он его увидел.

вопрос: как создать экземпляр класса в файле дочерней директории?

если не сложно подскажите в чем моя ошибка?
очень нужен именно второй вариант!

спасибо всем за помощь



Спустя 15 минут, 2 секунды (23.02.2012 - 11:48) inpost написал(а):
Абсолютные пути от корня давай с помощью DOCUMENT_ROOT

Спустя 9 минут, 56 секунд (23.02.2012 - 11:58) skolozhabskiy написал(а):
спасибо за ответ, но проблема не в этом, уже пробовал этот вариант.

есть еще мнения по ошибкам или все как правильно прописать имя поля ввода инпута файла, когда содается экземпляр класса на странице php в дочерней директории от корня.


спасибо

Спустя 12 минут, 36 секунд (23.02.2012 - 12:10) inpost написал(а):
error_reporting(E_ALL);
display errors в htaccess ON
ставь, и смотри ошибку

Я уверен на 90%, что ошибка с путями.

Спустя 11 минут, 31 секунда (23.02.2012 - 12:22) skolozhabskiy написал(а):
хорошо, тогда по директориям:

1. файл test.php - в корневой директории сайта

2. файл uploadfile.php в дочерней директории от корня: inc/uploadfile.php и в нем прописан путь загрузки файлов следующий:

'upload_dir' => '../img/uploads/', // Директория для сохранения загруженных файлов


3. файл с кодом обработки данных в php ajax-test.php в дочерней директории ajax/ajax-test.php, где подключен файл с классом и создан экземляр класса:

include_once('../inc/uploadfile.php');
$file = new UploadFile('upload_file');


вы видете здесь ошибку?

спасибо

Спустя 2 минуты, 36 секунд (23.02.2012 - 12:24) inpost написал(а):
Да, .. - уже ошибка.

Спустя 3 минуты, 24 секунды (23.02.2012 - 12:28) skolozhabskiy написал(а):
и где?

если так:


'upload_dir' => 'img/uploads/', // Директория для сохранения загруженных файлов


или


'upload_dir' => '/img/uploads/', // Директория для сохранения загруженных файлов


то так тоже не загружаются файлы

спасибо

Спустя 8 минут, 29 секунд (23.02.2012 - 12:36) inpost написал(а):
Это не абсолютные рутовские пути в файловой системе.
Как вариант, есть DOCUMENT_ROOT.

Спустя 3 минуты, 44 секунды (23.02.2012 - 12:40) skolozhabskiy написал(а):
DOCUMENT_ROOT - в данном случае не вариант, он показывает путь Apache/test.ru/www или что-то в этом роде, а мой путь в отладчике еще дополнительно имеет папку в которой лежат все файлы и именно она является корневой директорией. Извините, я не профессиональный программист, возможно допускаю неточности, но смысл я думаю понятен. Здесь дело не в DOCUMENT_ROOT. Ведь на одной странице все коды (test.php + ajax-test.php) работают на УРА!!! и БЕЗ DOCUMENT_ROOT! а если их разнести, то загрузки файлов нет.

может еще есть варианты решения проблемы.

спасибо

Спустя 15 минут, 54 секунды (23.02.2012 - 12:56) inpost написал(а):
DOCUMENT_ROOT.'/дополнительная папка/'

Спустя 10 минут, 33 секунды (23.02.2012 - 13:06) caballero написал(а):
DOCUMENT_ROOT - это корень твоего сайта неважно где он там лежит на сервере.
А вообще если работаешь с классами то лучше автолоад использовать - не будут инклудится ненужные в ланный момент файлы

Спустя 3 минуты, 53 секунды (23.02.2012 - 13:10) skolozhabskiy написал(а):
спасибо за ответ,


'upload_dir' => $_SERVER['DOCUMENT_ROOT'].'/моя директория корневая/img/uploads/', // Директория для сохранения загруженных файлов



вариант не работает.

есть еще варианты?

спасибо

Спустя 2 минуты (23.02.2012 - 13:12) inpost написал(а):
моя директория корневая - а ты уверен, что она именно так называется? Я не верю smile.gif

Спустя 1 минута, 36 секунд (23.02.2012 - 13:14) inpost написал(а):
Как минимум названия должны быть англ. буквами.
Как дополнение, я сказал, чтобы ты делал для обоих случаев, а ты сделал только для одного.
У тебя явно ошибка вывестись должна, но ты ничего не озвучил.
Ещё права на папку не сказал, точно ли 777, а это сделать надо...

ладно, не хочешь идти на попутную, я "умываю" ноги smile.gif

Спустя 8 минут, 59 секунд (23.02.2012 - 13:23) skolozhabskiy написал(а):
inpost

спасибо за ответ, конечно корневая директория не называется русскими буквами :-)
это по-моему и идиоту понятно. иначе здесь и делать такому нечего.

назовите ее как хотите, например, "test" и что это меняет?

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

да и никаких ошибок лог файл в корне Apache/test.ru не показывает

спасибо

Спустя 1 час, 21 минута, 32 секунды (23.02.2012 - 14:44) Pulse написал(а):
Как вариант для указания путей можно использовать конструкцию вида:
dirname(__FILE__) . '/путь относительно текущей директории';

Спустя 12 минут, 29 секунд (23.02.2012 - 14:57) skolozhabskiy написал(а):
С ПУТЯМИ ВСЕ ОТЛИЧНО!!!

с самого начала я это предполагал и дискуссия все время шла в ошибочную сторону.

ошибку я вроде нашел, но не могу понять пока как ее исправить.

если отправка данных идет просто кликом по кнопке submit формы, то есть POST, то загрузка файлов происходит, даже если скрипты разнесены в разные файлы и директории, как во втором варианте, но если я отправляю данные с серилизацией через аякс то есть GET, то загрузка файлов не происходит.

вот примерно такая схема или код файла test.php следующий:

<form id="form_name" name="form_name" enctype="multipart/form-data" method="POST" action="ajax/ajax-test.php">
<
input type="file" id="upload_input" name="inp_file" />
<
input type="submit" value="Загрузить файл" />
</
form>

работает, но если изменить вариант отправки данных в ajax/ajax-test.php на

код файла test.php следующий:

<script type="text/javascript">
$(function() {
$('#form_name').submit(function(event) {
event.preventDefault();

var str = $(this).serialize();
$.ajax({
url: 'ajax/_ajax-test.php',
type: 'GET',
и так далее
});
});
</
script>

<
form id="form_name" name="form_name" enctype="multipart/form-data" method="POST" action="ajax/ajax-test.php">
<
input type="file" id="upload_input" name="inp_file" />
<
input type="submit" value="Загрузить файл" />
</
form>

как быть мне нужно отправлять данные в GET и POST одновременно.
почему файл для загрузки только использует POST?

спасибо за помощь.

Спустя 48 минут, 45 секунд (23.02.2012 - 15:46) inpost написал(а):
Ajax файлы не отправляет.
И уж тем более методом GET.

Спустя 11 минут, 53 секунды (23.02.2012 - 15:57) skolozhabskiy написал(а):
это мне уже понятно, но как тогда мне использовать форму, которая с одной стороны должна послать аяксом данные GET и задействовать поле input file одновременно?

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

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

спасибо

Спустя 1 час, 11 секунд (23.02.2012 - 16:58) caballero написал(а):
Цитата
с самого начала я это предполагал и дискуссия все время шла в ошибочную сторону.

это у тебя она шла в ошибочную строну и до сих пор еще идет.
Следует использовать либо DOCUMENT_ROOT либо (что вобщем то тот же результат) __FILE__ в index.php чтобы получить путь к корню сайта. Завтра ты файл переложишь и будешь выискивать все относительные пути чтобы исправить.

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

а что должно загрузится если ты запретил отправку

Спустя 3 минуты, 13 секунд (23.02.2012 - 17:01) caballero написал(а):
Цитата
Ajax файлы не отправляет.
И уж тем более методом GET.

методом POST вообще то отправить можно

Спустя 19 минут, 55 секунд (23.02.2012 - 17:21) skolozhabskiy написал(а):
спасибо, но я настоятельно прошу дискуссию о путях прекратить.

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

если вставить одну форму в другую и делать submit второй формы загрузки файла на change результат 0, а если ее вынести за пределы первой формы, то все работает, но тогда изменяется стиль первой формы, а нужно чтобы была единая форма.

спасибо за помощь

Спустя 1 минута, 23 секунды (23.02.2012 - 17:22) inpost написал(а):
skolozhabskiy
У тебя как минимум видно ошибку в коде, ты кавычку пропустил. Выше смотри.

caballero
Я знаю только стандартную отправку на iframe, но это уже не Аякс. А как аяксом файл упаковывать, тут нет идей.

Спустя 5 минут, 49 секунд (23.02.2012 - 17:28) skolozhabskiy написал(а):
спасибо за внимательность, только это не ошибка - это просто техническая описка ничего не значащая в вопросе. если вам не сложно и вы понимаете смысл вопроса, то не нужно обращать внимание на мелкие описке. в самом коде все нормально и все кавычки как нужно.

а что значит стандартная отравка на iframe?

как отправить файл на POST?

спасибо


Спустя 2 минуты, 27 секунд (23.02.2012 - 17:30) inpost написал(а):
Ты издеваешься? Из-за этого JS-SELECTOR не мог выбрать объект, в связи с чем НЕВОЗМОЖНО БЫЛО работать с данной функцией, так как у тебя ошибка в коде.

Спустя 7 минут, 8 секунд (23.02.2012 - 17:38) skolozhabskiy написал(а):
да не ошибка это, просто здесь когда набирал не поставил кавычку и все. :-)

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

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

спасибо

Спустя 23 минуты, 30 секунд (23.02.2012 - 18:01) caballero написал(а):
Цитата
Я знаю только стандартную отправку на iframe, но это уже не Аякс. А как аяксом файл упаковывать, тут нет идей.

Я просто беру плагин от jQuery и не заморачиваюсь. обычная отправка формы аяксом.
Есть и другие способы - это модно ща - аплоадить файл и чтобы прогресбар бежал по экрану

Спустя 5 минут, 35 секунд (23.02.2012 - 18:07) skolozhabskiy написал(а):
у меня задача проще, все что мне необходимо это отправить аяксом с двух текстовых полей данные и вывести их на странице, одновременно с этим загрузить файл изображения безо всяких там прогресс-баров и всю эту информацию включая имя файла в директории загрузки внести в базу данных.

это может готовый плагин? можно ссылку на него? спасибо

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

спасибо и жду может все же кто-то выйдет на конструктивную дискуссию.

Спустя 1 час, 17 минут, 13 секунд (23.02.2012 - 19:24) skolozhabskiy написал(а):
если вариантов нет, то вот есть такая форма:


<form id="form_name" name="form_name" enctype="multipart/form-data" method="POST" action="">
<
input type="text" name="user" />
<
input type="text" name="email" />
<
input type="file" name="upload_file" />
<
input type="submit" value="Submit" />
</
form>


и скрытый фрейм? например:


<iframe name="upload_iframe" id="upload_iframe" style="display: none;"></iframe>



поля формы с именами user, email и имя файла должны быть переданы через аякс (как в предыдущих постах), а как a фоновом режиме теперь загрузить сам файл в нужную директорию?

кстати имя файла таки можно получить серилизацией.

спасибо за идеи и подсказки.

Спустя 24 минуты, 18 секунд (23.02.2012 - 19:48) skolozhabskiy написал(а):
как вариант:



<script type="text/javascript">
$(function() {
$('#upload_input').change(function() {
$('#file_input_text').val($('#upload_input').val());
});

$('#form1').submit(function(event) {
event.preventDefault();

var str = $(this).serialize();
$.ajax({
url: 'ajax/_ajax-test.php',
type: 'GET',
и так далее
});
});
</
script>

<
div style="display:block; margin:10px auto; width:400px;">
<
form id="form1" name="form1" enctype="multipart/form-data" target="myiFrame" method="POST" action="ajax/_ajax-test.php">
<
table>
<
tbody>
<
tr>
<
td><input type="text" name="username" /></td>
</
tr>
<
tr>
<
td colspan="2"><input id="file_input_text" type="text" name="file_path" /></td>
</
tr>
<
tr>
<
td width="50%">
<
input type="file" id="upload_input" name="file_image" />
</
td>
<
td width="50%">
<
td colspan="2"><input type="submit" value="Отправить" /></td>
</
td>
</
tr>
</
tbody>
</
table>
</
form>
</
div>

<
iframe name="myiFrame" src="img/uploads/" style="display:none;"></iframe>


пока не работает. есть идеи? профессионалы форума?

спасибо

Спустя 3 часа, 51 минута, 21 секунда (23.02.2012 - 23:39) killer8080 написал(а):
skolozhabskiy
если в теге form добавить атрибут target="upload_iframe", безо всяких джиквери, запрос будет отправлен в ифрейм, без перезагрузки страницы. Собственно это и делают плагины к фремворкам. Остаётся только чтоб сервер, после загрузки, выкинул колбек.

Цитата (inpost @ 23.02.2012 - 16:22)
Я знаю только стандартную отправку на iframe, но это уже не Аякс.

Вообще то формально это то же аякс smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.