1

次の php ファイルを使用してデータをローカル ストレージにアップロードし、パスを db に保存します。ファイルがアップロードされていますが、ダウンロードしようとすると、ファイルのコンテンツを取得できません。空白のページしか表示されません。より大きなサイズのデータ​​がアップロードされる可能性があるため、File_get content メソッドを使用できません。そのために何ができますか?

ここに私のアップロードコード 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ファイルを変更する必要があることは知っています.しかし、どのような変更を加える必要があるかわかりません.

4

1 に答える 1

0

簡単なダウンロード スクリプトを次に示します。クエリを使用して、ファイルの完全なパス (または相対パス) を取得できます。独自のバッファが組み込まれているため、使用する必要はありません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;
        }
    }
于 2013-02-13T13:47:13.980 に答える