【问题标题】:Generate CSV, download to local machine and save to the server at the same time生成CSV,下载到本地,同时保存到服务器
【发布时间】:2017-04-04 08:12:14
【问题描述】:

我有这个 PHP 脚本(见下文),它允许我使用 SQL 查询生成 CSV 文件并将其下载到我的本地机器,但我如何将它保存到远程服务器 (http://myserverblabla.com/uploads) 同时在那边留个备份?是否可以修改我现有的脚本来实现这一点?

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()]);
}

【问题讨论】:

  • myserverblabla.com/uploads 的规格是什么?你能在里面ssh吗?你可以在那里使用php吗?要下载 cvs,你需要登录或类似的吗?

标签: php download


【解决方案1】:

为什么不简单地复制您生成的文件?只需在 fclose($fp); 之后插入类似 copy(your file $fp, destination dir/filename); 的内容即可

【讨论】:

    【解决方案2】:

    我已经弄清楚了自己......

    我已更改 fopenfunction 以便将 CSV 文件保存到服务器:

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

    【讨论】:

      【解决方案3】:

      一种将文件上传到服务器的简单方法。 自动地做到这一点有点困难,但没有什么比尝试更好的了。 为此,您需要了解一点 AJAX、Json、JQuery 和文件上传。

      您需要在客户端中正常上传文件:

      <!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>
      

      在您的服务器中:

      <?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.";
          }
      }
      ?>
      

      在您的情况下,您不想创建将文件获取到服务器的接口。为此,您需要使用一些 ajax 和 json 或 Jquery File Upload。

      在网站上查看示例。

      我曾尝试做类似的事情,但我被困在 ajax 发布中,它有效但仅在一个表单内。解决方法是只将文件发送到服务器。

      当您创建第一个代码并出现第一个问题时,我会尽力提供帮助。两个头比一个更好。

      【讨论】:

        【解决方案4】:

        我已经更改了你的代码检查它:

        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()]);
        }
        

        csv文件夹也应该有读写权限。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-17
          • 1970-01-01
          • 1970-01-01
          • 2011-07-06
          • 1970-01-01
          相关资源
          最近更新 更多