来自在线下载链接的PHP访问文件,而不是直接

时间:2016-12-28 23:30:15

标签: php download google-sheets

我在google驱动器上有一个在线电子表格。此电子表格是公开的,可通过网址访问。将export?format=csv附加到公共网址会打开一个下载提示,允许客户端查看者通过选择文件位置并单击"下载",将在线电子表格文件的CSV版本下载到他们的计算机。

我想要做的是让我的PHP脚本与Google提供的下载链接https://docs.google.com/spreadsheets/d/<KEY>/export?format=csv进行互动

而不是像www.example.com/file.csv

这样的直接下载链接

由于Google使用$_GET ?format=csv值来指导客户端下载,我不能只使用include_once()或类似的方法来访问我的脚本中的文件,因为将访问负责显示谷歌电子表格的HTML文件。

如果不是直接下载链接,如何通过PHP访问此在线下载? PHP之外的其他方法也是受欢迎的,只要我可以通过PHP访问CSV文件的数据(或暂时或永久地下载到服务器)

2 个答案:

答案 0 :(得分:2)

简单file_get_contents()应该可以正常使用。

$content = file_get_contents('https://docs.google.com/spreadsheets/d/<KEY>/export?format=csv');

答案 1 :(得分:0)

经过多天的混乱解决问题后,我终于根据网络上的多个教程和示例找出了这个问题。这些都不符合我的需求,但基本上这就是我想出的从互联网下载已发布的Google电子表格而不使用使用Google API

$fileid = "spreadsheet file id here";
$url = "https://docs.google.com/spreadsheets/d/".$fileid."/export?format=csv&id=".$fileid;

$newfilename = "newfile";

$file = fopen($url,"r");

$output = fopen($newfilename.'.csv', 'wb');

while (($data = fgetcsv($file, 1000, ",")) !== FALSE) {
       fputcsv($output, $data);
}

fclose($file);
fclose($output);

运行此代码后,脚本会从Google电子表格中获取数据并将其输出到由$newfilename.csv text/csv格式package sample; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ProgressBar; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.Pane; import javafx.stage.Stage; import javafx.event.EventHandler; import javafx.scene.input.MouseEvent; import java.io.IOException; import java.util.ResourceBundle; import java.util.ArrayList; import java.util.Random; public class Controller { playercard iceborn = new playercard(3, false, true, 0); playercard fireball = new playercard(5, true, false, 0); playercard warmogs = new playercard(0, false, false, 10); ArrayList<playercard> playerhand = new ArrayList<>(); ******************************* public void add() { playerhand.add(iceborn); playerhand.add(fireball); playerhand.add(warmogs); } public playercard output() { Random rand = new Random(); int xzufallszahl = rand.nextInt(3); int zufallszahl = xzufallszahl; return playerhand.get(zufallszahl); } ********************************* @FXML Stage stage; public Button Startgameb; @FXML public ProgressBar enemyhpnow; @FXML public void Startgamebaction(ActionEvent event) throws IOException{ *************** add(); ************** Parent root = FXMLLoader.load(getClass().getResource("Menu.fxml")); Pane root1 = FXMLLoader.load(getClass().getResource("Tutorial.fxml")); Pane root2 = FXMLLoader.load(getClass().getResource("Game.fxml")); Scene tutorialscene = new Scene(root1, 900, 600); Scene gamescene = new Scene(root2, 900, 600); Image card = new Image("sample/card.jpg"); ImageView firstplayercard = new ImageView(); firstplayercard.setImage(card); firstplayercard.setFitWidth(120); firstplayercard.setFitHeight(160); firstplayercard.setLayoutX(50); firstplayercard.setLayoutY(430); ImageView secondplayercard = new ImageView(); secondplayercard.setImage(card); secondplayercard.setFitWidth(120); secondplayercard.setFitHeight(160); secondplayercard.setLayoutX(175); secondplayercard.setLayoutY(430); ImageView thirdplayercard = new ImageView(); thirdplayercard.setImage(card); thirdplayercard.setFitWidth(120); thirdplayercard.setFitHeight(160); thirdplayercard.setLayoutX(300); thirdplayercard.setLayoutY(430); ImageView fourthplayercard = new ImageView(); fourthplayercard.setImage(card); fourthplayercard.setFitWidth(120); fourthplayercard.setFitHeight(160); fourthplayercard.setLayoutX(425); fourthplayercard.setLayoutY(430); ImageView fifthplayercard = new ImageView(); fifthplayercard.setImage(card); fifthplayercard.setFitWidth(120); fifthplayercard.setFitHeight(160); fifthplayercard.setLayoutX(550); fifthplayercard.setLayoutY(430); root2.getChildren().addAll(firstplayercard, secondplayercard, thirdplayercard, fourthplayercard, fifthplayercard); ********************************** firstplayercard.setOnMouseClicked(e ->{ enemyhpnow.setProgress(output().activate()); }); ********************************** Stage stage; stage=(Stage) Startgameb.getScene().getWindow(); stage.setScene(gamescene); stage.show(); } } 确定的新创建文件。

我希望这有助于将来的某些人。我已经看到很多关于SO和网络其他部分的主题,关于如何在没有API的情况下以CSV格式访问Google电子表格数据,并且在从未找到不涉及API的真实答案之后,我认为我已经做完了!