Я использую следующий php-файл для загрузки данных в локальное хранилище и сохранения пути в db. Файлы загружаются. Но когда я пытаюсь загрузить его, я не получаю содержимое файла. Я получаю только пустую страницу. Я не могу использовать метод содержимого File_get, так как могут быть загружены более крупные данные. Что я могу сделать для этого?
вот мой код загрузки Upload.php
$id=$_POST['id']; $fileTypes = array('txt','doc','docx','ppt','pptx','pdf'); $fileParts = pathinfo($_FILES['uploaded_file']['name']); if(in_array($fileParts['extension'],$fileTypes)) { $filename = $_FILES["uploaded_file"]["name"]; $location = "D:\\Uploads/"; $path = $location . basename( $_FILES['uploaded_file']['name']); move_uploaded_file( $_FILES["uploaded_file"]["tmp_name"], $location . $_FILES['uploaded_file']['name']); $result = $mysqli->multi_query("call sp_upload_file('".$id."','" . $filename . "','".$path."')"); if ($result) { do { if ($temp_resource = $mysqli->use_result()) { while ($row = $temp_resource->fetch_array(MYSQLI_ASSOC)) { array_push($rows, $row); } $temp_resource->free_result(); } } while ($mysqli->next_result()); } echo "Successfully Uploaded"; } else { echo " Invalid File Type"; }
Сохраненная процедура sp_upload_file выглядит следующим образом.
DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `sp_upload_file`$$ CREATE PROCEDURE `sp_upload_file`(IN id INT,IN filename VARCHAR(200),IN path VARCHAR(200)) BEGIN IF EXISTS(SELECT `Training_Id`, `Material_Name`,Material_Path FROM `training_material` WHERE `Training_Id` = id AND `Material_Name` = filename AND `Material_Path` = path ) THEN UPDATE `training_material` SET Training_Id = id, Material_Name = filename, Material_Path = path, Modified_Date = NOW() WHERE `Training_Id` = id AND `Material_Name` = filename AND `Material_Path` = path ; ELSE INSERT INTO `training_material` (`Training_Id`, `Material_Name`, `Material_Path`, `Created_Date`, `Modified_Date`) VALUES (id, filename, path, NOW() ,NOW()); END IF; END$$ DELIMITER ;
Ниже приведен код для загрузки файла
if(isset($_GET['id'])) { $id=$_GET['id']; $mid=$_GET['mid']; $query = "call sp_download_file('".$mid."')"; $result = mysql_query($query) or die('Error, query failed'); list($name) = mysql_fetch_array($result); header("Content-Disposition: attachment; filename=$name"); ob_clean(); flush(); exit;
}
Ниже приведен список sp для загрузки данных:
DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `sp_download_file`$$ CREATE DEFINER=`root`@`%` PROCEDURE `sp_download_file`(IN id INT) BEGIN SELECT Material_Name FROM training_material WHERE `Training_Material_Id` = id; END$$ DELIMITER ;
помогите в этом. Я знаю, что мне нужно изменить файл download.php. Но не знаю, какие изменения мне нужно сделать.
Вот простой сценарий загрузки. Вы можете использовать свой запрос, чтобы получить полный путь к файлу (или относительному). У него есть собственный буфер, поэтому нет необходимости использовать ob_start
if ($fd = fopen ($fullPath, "r")) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); header("Content-length: $fsize"); header("Cache-control: private"); //use this to open files directly while(!feof($fd)) { $buffer = fread($fd, 2048); echo $buffer; } }