2017-04-04 39 views
9

Mam ten skrypt PHP (patrz poniżej), który pozwala mi generować plik CSV za pomocą zapytania SQL i pobrać go na moją maszynę lokalną, ale jak można Zapisuję go na serwerze zdalnym (http://myserverblabla.com/uploads) w tym samym czasie, aby zachować tam kopię zapasową? Czy byłoby możliwe zmodyfikowanie istniejącego skryptu, aby to osiągnąć?Generowanie pliku CSV, pobieranie na lokalny komputer i zapisywanie na serwerze w tym samym czasie

include 'class/database.class.php'; 

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"filename.csv\";"); 
header("Content-Transfer-Encoding: binary"); 

$database = new Database(); 

try{ 
    // Select query 
    $database->query("SOME SQL QUERY"); 
    $data = $database->resultset(); 

    $fp = fopen('php://temp', 'r+'); 
    foreach ($data as $row) { 
     if (! isset($ch)) { 
      foreach ($row as $header => $value) { 
       if (isset($ch)) 
        $ch .= ","; 
        else 
         $ch = ""; 

         $ch .= '"' . addslashes($header) . '"'; 
      } 
     } 
     fputcsv($fp, $row, ",", '"'); 
    } 

    rewind($fp); 
    $csv = fread($fp, 1048576); 
    fclose($fp); 
    echo $ch . PHP_EOL . rtrim($csv, PHP_EOL); 
} 
catch(PDOException $e){ 
    echo json_encode((object)['error'=>true,'message'=>$e->getMessage()]); 
} 
+0

jakie są specyfikacje http://myserverblabla.com/uploads? czy możesz tam ssh? czy możesz tam użyć php? Aby pobrać cvs, musisz się zalogować lub coś podobnego? – borracciaBlu

Odpowiedz

5

Mam zorientowali się ...

Zmieniłem fopen funkcji w celu zapisania pliku CSV na serwerze:

$fp = fopen('uploads/test.csv', 'w+');

3

Prosty sposób, aby plik został przesłany na serwer. Aby zrobić to automatycznie, jest nieco trudniej, ale nie ma to jak próbowanie. Do tego trzeba trochę informacji o AJAX, Json, JQuery i przesyłaniu plików.

normalny plik trzeba przesłać w kliencie:

<!DOCTYPE html> 
<html> 
<body> 

<form action="upload.php" method="post" enctype="multipart/form-data"> 
    Select image to upload: 
    <input type="file" name="fileToUpload" id="fileToUpload"> 
    <input type="submit" value="Upload Image" name="submit"> 
</form> 

</body> 
</html> 

na serwerze:

<?php 
$target_dir = "uploads/"; 
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); 
$uploadOk = 1; 
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
// Check if image file is a actual image or fake image 
if(isset($_POST["submit"])) { 
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); 
    if($check !== false) { 
     echo "File is an image - " . $check["mime"] . "."; 
     $uploadOk = 1; 
    } else { 
     echo "File is not an image."; 
     $uploadOk = 0; 
    } 
} 
// Check if file already exists 
if (file_exists($target_file)) { 
    echo "Sorry, file already exists."; 
    $uploadOk = 0; 
} 
// Check file size 
if ($_FILES["fileToUpload"]["size"] > 500000) { 
    echo "Sorry, your file is too large."; 
    $uploadOk = 0; 
} 
// Allow certain file formats 
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" 
&& $imageFileType != "gif") { 
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; 
    $uploadOk = 0; 
} 
// Check if $uploadOk is set to 0 by an error 
if ($uploadOk == 0) { 
    echo "Sorry, your file was not uploaded."; 
// if everything is ok, try to upload file 
} else { 
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { 
     echo "The file ". basename($_FILES["fileToUpload"]["name"]). " has been uploaded."; 
    } else { 
     echo "Sorry, there was an error uploading your file."; 
    } 
} 
?> 

W twoim przypadku nie chcesz, aby utworzyć interfejs, który pobrać plik do serwer. Do tego trzeba użyć ajax i json lub Jquery File Upload.

Zobacz na stronie przykłady.

Próbowałem coś takiego zrobić, ale utknąłem w wysyłaniu ajax, działało, ale tylko w formie. Sposób na to, aby wysłać tylko plik na serwer.

po utworzeniu pierwszego kodu i pojawieniu się pierwszych problemów Próbuję pomóc. Dwie głowy działają lepiej niż jedna.

5

Dlaczego nie po prostu skopiować wygenerowany plik? Wystarczy włożyć coś takiego copy(your file $fp, destination dir/filename); Po fclose($fp);

2

I zmieniłem kod Sprawdź:

include 'class/database.class.php'; 

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"filename.csv\";"); 
header("Content-Transfer-Encoding: binary"); 

$database = new Database(); 

try{ 
    // Select query 
    $database->query("SOME SQL QUERY"); 
    $data = $database->resultset(); 

    ob_start(); 
    $fp = fopen('path/to/folder/filename.csv', 'w'); 
    foreach ($data as $row) { 

     if (! fputcsv($fp, $row)) 
     { 
      show_error("Can't write line $n: $line"); 
     } 
    } 
    fclose($fp) or show_error("Can't close path/to/folder/filename.csv"); 
    $str = ob_get_contents(); 
    ob_end_clean(); 
    print "\xEF\xBB\xBF"; // UTF-8 BOM 
    print $str; 
} 
catch(PDOException $e){ 
    echo json_encode((object)['error'=>true,'message'=>$e->getMessage()]); 
} 

Również folder csv shoul d mieć pozwolenie na pisanie i czytanie.