问题描述
我的网站具有一项功能,用户可以在其中上传指向其google docs文件的链接。我想做的是在一个地方列出所有上传的链接。这样做时,我需要显示与链接关联的文件的名称。
我可以从链接中提取文件ID,并确保链接属于google docs。现在,我需要找到一种从中获取文件名的方法。我尝试通过适用于Google驱动器的Google Developer API,但这仅用于在授权文档上上传/执行任何操作。我的问题是,我的用户将文件手动上传到他们无法控制的文档中。我所得到的只是一个可共享的链接,并以某种方式获得了它的名字。此外,缩略图也会有所帮助。
我尝试这样做,但是会引发错误
$url = "https://www.googleapis.com/drive/v3/files/1G6N6FyXzg7plgEtJn-Cawo5gbghrS8z9_j_cvVqcEDA";
// and
$url = "https://docs.google.com/document/d/1G6N6FyXzg7plgEtJn-Cawo5gbghrS8z9_j_cvVqcEDA/edit?usp=sharing"
$html= file_get_contents($url);
print_r($html);
愿意为任何人提供帮助的虚拟链接:https://docs.google.com/document/d/1G6N6FyXzg7plgEtJn-Cawo5gbghrS8z9_j_cvVqcEDA/edit?usp=sharing
解决方法
由于我们获取文件的URL,所以我们可以做几件事-
- 获取ID到文件
- 获取该文件的类型
在我解释如何做之前,最好知道可能有两种情况。一个文件是google docs文件,另一个文件是google驱动器文件。它们都以不同的URL开头。
$url = explode('/',Str::after(
Str::after($request->url,'https://docs.google.com/'),'https://drive.google.com/'
));
我正在使用2 Str::after()
从URL中删除不必要的部分。然后,我使用explode将URL转换为数组。
由于我们已从网址中排除了无用的部分,所以我们将document/d/1G6N6FyXzg7plgEtJn-Cawo5gbghrS8z9_j_cvVqcEDA/edit?usp=sharing
保留为数组形式。
因此,如果我们尝试执行$url[2]
,我们将获得文件的ID。另外,“文档”也是要注意的一件好事。我用那些来显示适当的图像。可以有5种不同的类型(4种用于google docs,1种用于google drive)。这些是-文档,电子表格,表格,Google文档的演示文稿和Google驱动器的文件。我建议每个人都将它们存储在数据库中,这样在显示它时就不需要进行额外的计算。
现在,回答问题的实际部分。如何获得名字。我创建了一个新的模型方法来处理这个问题。
public function name()
{
$key = config('app.google_api_key');
$url = "https://www.googleapis.com/drive/v3/files/{$this->file_id}?key={$key}";
$response = Http::get($url)->json();
return $response['name'] ?? 'Private File';
}
请不要忘记将Google API密钥添加到配置文件app.php
中(您需要创建一个)。您可以从Google Developer Console获取API密钥,并创建特定于项目的密钥。仅需注意,该密钥不必属于URL用户。
此外,这里要注意的一点是,如果文件未设置为对公众可见或文件被删除,$response
将返回错误代码。