如何使用来自 VK 或其他社交网络的 url 照片上传到 google 驱动器

How upload a photo to google drive using url of photo from VK or another social net

我有一张来自 VK 的 url 照片。这是 url:

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 上传照片。如果你能帮助我,谢谢

你不能传一个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;
      }

How to upload a file to Google Drive with C# .net

无耻地撕下的代码

您可以尝试这种利用 MediaIoBaseUpload:

的方法
url = 'https://sun9-28.userapi.com/impf/c850732/v850732336/16fa43/3b7pxN3vzmI.jpg?size=400x400&quality=96&sign=e43d16ae62020287b2e5ae9073d3f878&c_uniq_tag=5rB9bM19KvnvwLaYvsXilF2uT-MWISzsiNrvNJH65UQ&type=album'
response = requests.get(url)
file_content = BytesIO(response.content) 
file_metadata = {'name': f'{name_photo}.jpg', 'parents': [folder_id]}
media = MediaIoBaseUpload(file_content, mimetype='image/jpeg')
service.files().create(body=file_metadata, media_body=media, fields='id').execute()

您仍然需要使用 requests 来检索文件内容,但是您使用上面的代码段上传将通过使用 Python API 客户端库来完成。

参考