Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Проблема с закачкой файлов базу. (http://www.flasher.ru/forum/showthread.php?t=72253)

Antoine 22.11.2005 17:50

Проблема с закачкой файлов базу.
 
Перечитал сообщения на форуме и не только на этом но так и несмог понять в чём дело.
Задача значит такая - выводится таблица с файломи закаченными пользователем (размер, тип и т.п.), но нужно чтобы название файла было ссылкой а вместо этого какие-то каракули и ссылка никуда не приводит. Вот посмотрите пожалуйста:
Это аплод:

PHP код:

function upload($username)  
{         
    function 
get_extension($filename)          
    
//This function uses regular expressions to find extension of uploaded file.
         
ereg("\.(.+)$"$filename$ext);   return $ext[0];         }    
           
//Setting variables short names.         
$upload $_FILES['upload']['tmp_name'];   
$upload_name $_FILES['upload']['name'];   
$upload_size $_FILES['upload']['size'];   
$upload_type $_FILES['upload']['type'];   
$ext get_extension($upload_name);   
$file addslashes(fread(fopen($upload"r"),$upload_size));               
$query "insert into data values ('".$username."','".$file."','".$upload_name."','".$upload_type."','".$upload_size."','".$ext."')";     
$result mysql_query($query);         
if (!
$result)          
{  
   echo 
'Can\'t upload file. Request for admin help.';      
    exit;         
}        
echo 
'File'.$upload_name.'succsessfully loaded';           


И просмотр:

PHP код:

]<?php   
function get_user_files($login,$db)   
{         
//This function get list of files of registered user.           
$query "select * from data where username='".$login."'";         
$result mysql_query($query,$db);         
echo 
'<form action="delete.php" method="post">             
         <table width="200" border="1"><tr>
<th>Name</th>
<th>Type</th>
<th>Size</th>          
<th>Extension</th>
<th>Delete?</th></tr>'
;   
while (
$row mysql_fetch_array($resultYSQL_ASSOC))       
{echo 
'<tr><td><a href="'.$row['file'].'>'.$row['name'].'</a>
</td><td>'
.$row['type'].'   
</td><td>'
.$row['size'].'
</td><td>'
.$row['ext'].'/>';   
}         
echo 
'</table>   </form>';  }    
?>


Skubent 22.11.2005 21:45

move_uploaded_file тебе поможет.
То есть после закачки, файл надо перенести в доступное по http место ( к примеру, в специально созданную директорию в корне сайта) и писать в базу место "постоянной дислокации" зачанного файла.
А по пути $_FILES['upload']['tmp_name'] к моменту просмотра может ничего не оказаться. К тому же директория для складирования временных файлов как правило недоступна для веб-сервера :)

Antoine 23.11.2005 02:48

Переписал но не помогло.

Мне нужно чтобы скрипт выводи спсок файлов принадлежащих конкретному юзеру ввиде ссылок на них и потом по нажатии на эти ссылки можно было этот файл закачать. Хранить обязательно в БД сами файла, а не пути к ним.
Бьюсь уже 2 суток почти без перерыыва и не знаю как.
На phpclub.ru все очень крутые и не захотели мне отвечать.
Помогите бо очень надо.

Skubent 23.11.2005 15:05

//Этот кусок в принципе работает, если складывать файлы в базу.
$upload = $_FILES['upload']['tmp_name'];
$upload_name = $_FILES['upload']['name'];
$upload_size = $_FILES['upload']['size'];
$upload_type = $_FILES['upload']['type'];
$ext = get_extension($upload_name);
$file = addslashes(fread(fopen($upload, "r"),$upload_size));
/*
а вот работает ли запрос - вопрос, тут надо глядеть, что у тебя в базе твориться. Предполагается, что структура таблицы имеет вид
CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(25), filedata BLOB, filename VARCHAR(50), filetype VARCHAR(8), filesize INT, fileext VARCHAR(8))
Тогда запрос принимает вид:
*/
$query = "INSERT INTO my_table SET
username = '$username',
filedata = '$file',
filename = '$upload_name',
filetype = '$upload_type',
filesize = '$upload_size',
fileext = '$ext')";
$result = mysql_query($query);
/*---вроде как сложили все в базу, правда могут быть косяки с BLOB'om, но это уже копать в сторону версии mySQL и php, тут только RTFM спасает ---*/
/*
Теперь помыслим про доставание списка.
*/
function get_user_files($login,$db)
{
//тут - адрес страницы-обработчика файлов.
$adres = 'file.php';
$query = "SELECT * FROM filedata WHERE username='$login' ";
$result = mysql_query($query,$db);
<table width="200" border="1"><tr>
<th>Name</th>
<th>Type</th>
<th>Size</th>
<th>Extension</th></tr>';
while ($row = mysql_fetch_array($result, YSQL_ASSOC))
{echo '<tr><td><a href=$adres?id="'.$row['id'].'>'.$row['name'].'</a>
</td><td>'.$row['type'].'
</td><td>'.$row['size'].'
</td><td>'.$row['ext'].'/>';
}
echo '</table>'; }
/*Теперь - содержание файла-обработчика, в нашем примере file.php*/
<?php
if (!isset($_GET['id'])) {die("Нет ничего.");}
//это чтобы фигню не написали :
$id = $_GET['id'] + 1;
$id = $id - 1;
/*выполним соединение с базой, достанем данные*/
$db = mysql_connect('host', 'login', 'pass');
mysql_select_db('database', $db);
$result = mysql_query("SELECT filedata, filetype, filesize FROM my_table WHERE id='$id'", $db);
$row = mysql_tetch_array($result);
/*отправим в браузер информацию о типе и размере файла*/
header("Content-type: ".$row[1]."\r\nContent-Length: ".$row[2]);
/*Выведем содержимое*/
echo $row[0];
mysql_free_result($result);
mysql_close($db);
?>

Antoine 23.11.2005 15:20

Спасибо огоромное.
Вот это я понимаю нормальный ответ и форум.
Впринципе я уже нашёл, что искал так что кому интересно смоотрите:

http://www.php-mysql-tutorial.com/php-mysql-upload.php

http://www.devarticles.com/c/a/MySQL...P-and-MySQL/3/

Antoine 23.11.2005 17:32

Тут так сказать развитие ситуации.
Как справится с проблемой закачивания файлов названия которых на русском языке. А то вот такое:

Warning: move_uploaded_file(../files/Antoine/????? ?? ?????.jpg) [function.move-uploaded-file]: failed to open stream: Invalid argument in D:\Antony\Papers\Works\PHP\Base\www\diplom\script\upload_func.php on line 20

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\TEMP\php350.tmp' to '../files/Antoine/????? ?? ?????.jpg' in D:\Antony\Papers\Works\PHP\Base\www\diplom\script\upload_func.php on line 20
Possible file upload attack!
Warning: fopen(../files/Antoine/????? ?? ?????.jpg) [function.fopen]: failed to open stream: Invalid argument in D:\Antony\Papers\Works\PHP\Base\www\diplom\script\upload_func.php on line 29

Warning: fread(): supplied argument is not a valid stream resource in D:\Antony\Papers\Works\PHP\Base\www\diplom\script\upload_func.php on line 29

Warning: fclose(): supplied argument is not a valid stream resource in D:\Antony\Papers\Works\PHP\Base\www\diplom\script\upload_func.php on line 30
File ????? ?? ?????.jpg succsessfully loaded to database.
Go to members page
Warning: unlink(../files/Antoine/????? ?? ?????.jpg) [function.unlink]: Invalid argument in D:\Antony\Papers\Works\PHP\Base\www\diplom\script\upload_func.php on line 43

И ещё при нажатии на сслку файл закачивается с именем скрипта хотя я и передал header("Content-Disposition: attachment; filename=$name");
и к тому же оказывается битым.

Antoine 23.11.2005 19:25

С тем что закачивается битым разобрался, но имя всё-равно download.
Ну и файла с русскими названиями всё равно вадают ошибку.

Skubent 23.11.2005 19:50

\r\n в конце хеадера с расположением контента, длину контента надо давать, в общем - читай стандарт.
Русские названия - ну да... Простейшее решение - делать замену русских букв на латинские аналоги на стороне клиента и с полным правом отказывать в приеме необработанных файлов.

Antoine 23.11.2005 21:45

Я это уже решил - там просто опечатку устроил а content-lenght я и так отправлял.
А можешь поподробнее про замену символов. Может можно хранить русские символы в мускуле. У меня мускул 4.1 м кодировка по умолчанию cp1251.

Skubent 23.11.2005 22:17

Про базу - после подключения к базе
mysql_query("SET NAMES cp1251");

Про замену - почитай доку по str_replace()


Часовой пояс GMT +4, время: 00:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.