首页 > 解决方案 > 如何使用来自 VK 或其他社交网络的照片 url 将照片上传到谷歌驱动器

问题描述

我有一个来自 VK 的照片网址。这是那个网址:

https://sun9-28.userapi.com/impf/c850732/v850732336/16fa43/3b7pxN3vzmI.jpg?size=400x400&quality=96&sign=e43d16ae62020287b2e5ae9073d3f878&c_uniq_tag=5rB9bM19KvnvwLaYvsXilF2uT-MWISzsiNrvNJH65UQ&type=album

我想上传这张图片而不把它下载到我的电脑上。我之前通过使用“请求”来做到这一点。我的代码如下:

para = {'name': f'{name_photo}', 'parents': [folder_id]}
files = {'data': ('metadata', json.dumps(para), 'application/json; charset=UTF-8'),
       # В запрос вставляем ссылку на фото в интернете и возвращаем в виде контента бинарного кода
       # потому что любой передаваемый файл должен быть в бинарном коде
'file': requests.get(url).content }
requests.post('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
                                headers={'Authorization': f'Bearer {access_token}'},
                                files=files)

它可以工作,但现在我决定使用“google drive api client”,但我遇到了一个问题,因为我无法上传文件。这是我的脚本

file_metadata = {'name': f'{name_photo}.jpg', 'parents': [folder_id]}
media = MediaFileUpload(url,
                        mimetype='image/jpeg')
service.files().create(body=file_metadata,
                       media_body=media,
                       fields='id').execute()

如果我输入“MediaFileUpload”一个本地文件,例如“files/photo.jpg”,我会成功,但如果我输入 url,我会收到错误

File "C:\Users\Sverchkov Family\Desktop\Моя учеба\Нетология\Python-разработчик\Basic python\Курсовая работа\Работа с доработаками и клиентской библиотекой гугл\lab_1_renew_by_google_client.py", line 128, in to_google_disk
    media = MediaFileUpload(url,
  File "C:\Users\Sverchkov Family\AppData\Local\Programs\Python\Python39\lib\site-packages\googleapiclient\_helpers.py", line 131, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Users\Sverchkov Family\AppData\Local\Programs\Python\Python39\lib\site-packages\googleapiclient\http.py", line 593, in __init__
    self._fd = open(self._filename, "rb")
OSError: [Errno 22] Invalid argument: 'https://sun9-28.userapi.com/impf/c850732/v850732336/16fa43/3b7pxN3vzmI.jpg?size=400x400&quality=96&sign=e43d16ae62020287b2e5ae9073d3f878&c_uniq_tag=5rB9bM19KvnvwLaYvsXilF2uT-MWISzsiNrvNJH65UQ&type=album'

我不知道如何解决这个问题并通过 url 上传照片。谢谢如果你帮助我

标签: google-drive-apigoogle-oauth

解决方案


您不能将 url 传递给 MediaFileUpload,您需要传递文件流 先将文件下载到您的机器,然后将其上传到驱动器您不能从 VK url 直接驱动

string uploadedFileId;
// Create a new file on Google Drive
await using (var fsSource = new FileStream(UploadFileName, FileMode.Open, FileAccess.Read))
      {
      // Create a new file, with metadata and stream.
      var request = service.Files.Create(fileMetadata, fsSource, "text/plain");
      request.Fields = "*";
      var results = await request.UploadAsync(CancellationToken.None);

      if (results.Status == UploadStatus.Failed)
         {
         Console.WriteLine($"Error uploading file: {results.Exception.Message}");
         }

          // the file id of the new file we created
          uploadedFileId = request.ResponseBody?.Id;
      }

如何使用 C# .net 将文件上传到 Google Drive 中无耻地撕下代码


推荐阅读