Skip to content

Commit 209494c

Browse files
committed
Allow to upload file-like objects
1 parent 11de220 commit 209494c

1 file changed

Lines changed: 44 additions & 19 deletions

File tree

vk_api/upload.py

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ def photo(self, photos, album_id,
2323
group_id=None):
2424
""" Загрузка изображений в альбом пользователя
2525
26-
:param photos: список путей к изображениям, либо путь к изображению
26+
:param photos: путь к изображению(ям) или file-like объект(ы)
27+
:type photos: str, list
28+
2729
:param album_id: идентификатор альбома
2830
:param latitude: географическая широта, заданная в градусах
2931
(от -90 до 90)
@@ -69,7 +71,8 @@ def photo(self, photos, album_id,
6971
def photo_messages(self, photos):
7072
""" Загрузка изображений в сообщения
7173
72-
:param photos: список путей к изображениям, либо путь к изображению
74+
:param photos: путь к изображению(ям) или file-like объект(ы)
75+
:type photos: str, list
7376
"""
7477

7578
url = self.vk.method('photos.getMessagesUploadServer')['upload_url']
@@ -86,7 +89,7 @@ def photo_profile(self, photo, owner_id=None, crop_x=None, crop_y=None,
8689
crop_width=None):
8790
""" Загрузка изображения профиля
8891
89-
:param photo: путь к изображению
92+
:param photo: путь к изображению или file-like объект
9093
:param owner_id: идентификатор сообщества или текущего пользователя.
9194
По умолчанию загрузка идет в профиль текущего пользователя.
9295
При отрицательном значении загрузка идет в группу.
@@ -122,7 +125,8 @@ def photo_profile(self, photo, owner_id=None, crop_x=None, crop_y=None,
122125

123126
def photo_chat(self, photo, chat_id):
124127
""" Загрузка и смена обложки в беседе
125-
:param photo: путь к изображению
128+
129+
:param photo: путь к изображению или file-like объект
126130
:param chat_id: ID беседы
127131
"""
128132

@@ -140,7 +144,9 @@ def photo_chat(self, photo, chat_id):
140144
def photo_wall(self, photos, user_id=None, group_id=None):
141145
""" Загрузка изображений на стену пользователя или в группу
142146
143-
:param photos: список путей к изображениям, либо путь к изображению
147+
:param photos: путь к изображению(ям) или file-like объект(ы)
148+
:type photos: str, list
149+
144150
:param user_id: идентификатор пользователя
145151
:param group_id: идентификатор сообщества (если загрузка идет в группу)
146152
"""
@@ -165,17 +171,17 @@ def photo_wall(self, photos, user_id=None, group_id=None):
165171

166172
return response
167173

168-
def audio(self, file_path, artist, title):
174+
def audio(self, audio, artist, title):
169175
""" Загрузка аудио
170176
171-
:param file_path: путь к аудиофайлу
177+
:param audio: путь к аудиофайлу или file-like объект
172178
:param artist: исполнитель
173179
:param title: название
174180
"""
175181

176182
url = self.vk.method('audio.getUploadServer')['upload_url']
177183

178-
f = open_files(file_path, key_format='file')
184+
f = open_files(audio, key_format='file')
179185
response = self.vk.http.post(url, files=f).json()
180186
close_files(f)
181187

@@ -188,22 +194,28 @@ def audio(self, file_path, artist, title):
188194

189195
return response
190196

191-
def document(self, file_path, title=None, tags=None, group_id=None, to_wall=False):
197+
def document(self, doc, title=None, tags=None, group_id=None,
198+
to_wall=False):
192199
""" Загрузка документа
193200
194-
:param file_path: путь к документу
201+
:param doc: путь к документу или file-like объект
195202
:param title: название документа
196203
:param tags: метки для поиска
197204
:param group_id: идентификатор сообщества (если загрузка идет в группу)
198-
:param to_wall: Определяет метод получения адреса загрузки (если True, загрузка будет на стену)
205+
:param to_wall: загрузить на стену
199206
"""
200207

201208
values = {'group_id': group_id}
202-
method = 'docs.getUploadServer' if not to_wall else 'docs.getWallUploadServer'
209+
210+
if to_wall:
211+
method = 'docs.getWallUploadServer'
212+
else:
213+
method = 'docs.getUploadServer'
214+
203215
url = self.vk.method(method, values)['upload_url']
204216

205-
with open(file_path, 'rb') as f:
206-
response = self.vk.http.post(url, files={'file': f}).json()
217+
files = open_files(doc, 'file')
218+
response = self.vk.http.post(url, files=files).json()
207219

208220
response.update({
209221
'title': title,
@@ -214,24 +226,37 @@ def document(self, file_path, title=None, tags=None, group_id=None, to_wall=Fals
214226

215227
return response
216228

217-
def document_wall(self, file_path, title=None, tags=None, group_id=None):
229+
def document_wall(self, doc, title=None, tags=None, group_id=None):
218230
""" Загрузка документа в папку Отправленные,
219231
для последующей отправки документа на стену
220232
или личным сообщением.
221233
222-
Описание параметров :func:`document`
234+
:param doc: путь к документу или file-like объект
235+
:param title: название документа
236+
:param tags: метки для поиска
237+
:param group_id: идентификатор сообщества (если загрузка идет в группу)
223238
"""
224239

225-
return self.document(file_path, title, tags, group_id, True)
240+
return self.document(doc, title, tags, group_id, True)
241+
226242

227243
def open_files(paths, key_format='file{}'):
228244
if not isinstance(paths, list):
229245
paths = [paths]
230246

231247
files = []
232248

233-
for x, filename in enumerate(paths):
234-
f = open(filename, 'rb')
249+
for x, file in enumerate(paths):
250+
if hasattr(file, 'read'):
251+
f = file
252+
253+
if hasattr(file, 'name'):
254+
filename = file.name
255+
else:
256+
filename = '.jpg'
257+
else:
258+
filename = file
259+
f = open(filename, 'rb')
235260

236261
ext = filename.split('.')[-1]
237262
files.append(

0 commit comments

Comments
 (0)