从 python 脚本上传文件到我的 Dropbox

Posted

技术标签:

【中文标题】从 python 脚本上传文件到我的 Dropbox【英文标题】:upload file to my dropbox from python script 【发布时间】:2014-07-16 15:35:35 【问题描述】:

我想将我的 python 脚本中的文件自动上传到我的 Dropbox 帐户。我无论如何都找不到只用一个用户/通行证来做到这一点。我在 Dropbox SDK 中看到的一切都与具有用户交互的应用程序有关。我只想做这样的事情:

https://api-content.dropbox.com/1/files_put//?user=me&pass=blah

【问题讨论】:

我可以对不赞成票发表评论吗?所以我可以改进这个问题? 官方SDK中包含示例:github.com/dropbox/dropbox-sdk-python/tree/master/example 【参考方案1】:

@Christina 的答案基于 Dropbox APP v1,现已弃用,将于 2017 年 6 月 28 日关闭。 (更多信息请参考here。)

APP v2 于 2015 年 11 月推出,更简单、更一致、更全面。

这里是APP v2的源代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dropbox

class TransferData:
    def __init__(self, access_token):
        self.access_token = access_token

    def upload_file(self, file_from, file_to):
        """upload a file to Dropbox using API v2
        """
        dbx = dropbox.Dropbox(self.access_token)

        with open(file_from, 'rb') as f:
            dbx.files_upload(f.read(), file_to)

def main():
    access_token = '******'
    transferData = TransferData(access_token)

    file_from = 'test.txt'
    file_to = '/test_dropbox/test.txt'  # The full path to upload the file to, including the file name

    # API v2
    transferData.upload_file(file_from, file_to)

if __name__ == '__main__':
    main()

源代码托管在 GitHub 上,here。

【讨论】:

我可以让它工作的唯一方法是将其更改为:dbx.files_upload(f.read(), file_to) @SteveLockwood,它在 1 年前对其进行了测试,并且成功了。无论如何,我按照你的建议更新了我的答案。 我想知道这是否是 python 2/3 的差异——我的例子是用 python 3 测试的 @SteveLockwood,我用 python2 测试过。【参考方案2】:

重要提示:此答案已弃用,因为 Dropbox 现在使用 v2 API。 当前API版本解决方案见@SparkAndShine的回答

感谢@smarx 的上述回答!我只是想为其他试图这样做的人澄清一下。

    当然,请确保首先安装 Dropbox 模块 pip install dropbox

    在“应用程序控制台”中以您自己的 Dropbox 帐户创建应用程序。 (https://www.dropbox.com/developers/apps)

    为了记录,我使用以下内容创建了我的应用程序:

    一个。应用类型为“Dropbox API APP”。

    b.数据访问类型为“文件和数据存储”

    c。文件夹访问权限为“我的应用需要访问 Dropbox 上已有的文件”。 (即:权限类型为“Full Dropbox”。)

    然后点击“生成访问令牌”按钮并剪切/粘贴到下面的python示例中,代替<auth_token>



import dropbox

client = dropbox.client.DropboxClient(<auth_token>)
print 'linked account: ', client.account_info()

f = open('working-draft.txt', 'rb')
response = client.put_file('/magnum-opus.txt', f)
print 'uploaded: ', response

folder_metadata = client.metadata('/')
print 'metadata: ', folder_metadata

f, metadata = client.get_file_and_metadata('/magnum-opus.txt')
out = open('magnum-opus.txt', 'wb')
out.write(f.read())
out.close()
print metadata

【讨论】:

正如下面 SparkAndShine 所强调的,这适用于 Dropbox API v1,现已弃用。 如何将文件从 S3 URL 上传到 Dropbox?【参考方案3】:

这是我使用 API v2(和 Python 3)的方法。我想上传一个文件并为其创建一个共享链接,我可以通过电子邮件将其发送给用户。它基于 sparkandshine 的示例。注意我认为当前的 API 文档有一个小错误,sparkandshine 已经纠正了。

import pathlib
import dropbox
import re

# the source file
folder = pathlib.Path(".")    # located in this folder
filename = "test.txt"         # file name
filepath = folder / filename  # path object, defining the file

# target location in Dropbox
target = "/Temp/"              # the target folder
targetfile = target + filename   # the target path and file name

# Create a dropbox object using an API v2 key
d = dropbox.Dropbox(your_api_access_token)

# open the file and upload it
with filepath.open("rb") as f:
   # upload gives you metadata about the file
   # we want to overwite any previous version of the file
   meta = d.files_upload(f.read(), targetfile, mode=dropbox.files.WriteMode("overwrite"))

# create a shared link
link = d.sharing_create_shared_link(targetfile)

# url which can be shared
url = link.url

# link which directly downloads by replacing ?dl=0 with ?dl=1
dl_url = re.sub(r"\?dl\=0", "?dl=1", url)
print (dl_url)

【讨论】:

应该注意的是,支持 v2 的较新的 Dropbox 库需要很多不同的库,如果您在像 Arduino Yun 这样的最小 linux 环境中,它们会耗尽设备上的所有内存并崩溃. :( As per the docs, files_upload 不适用于大于 150 MB 的文件。 对于大于 150 MB 的上传:***.com/a/37399658/1717535【参考方案4】:
import dropbox
access_token = '************************'
file_from = 'index.jpeg'  //local file path
file_to = '/Siva/index.jpeg'      // dropbox path
def upload_file(file_from, file_to):
    dbx = dropbox.Dropbox(access_token)
    f = open(file_from, 'rb')
    dbx.files_upload(f.read(), file_to)
upload_file(file_from,file_to)

【讨论】:

就是这么简单。 工作就像一个魅力。这个答案应该更高。 被低估的答案。【参考方案5】:

对 Dropbox API 的调用进行身份验证的唯一方法是使用 OAuth,这涉及到用户授予您应用的权限。我们不允许第三方应用处理用户凭据(用户名和密码)。

如果这仅适用于您的帐户,请注意,您可以轻松地为自己的帐户获取 OAuth 令牌并使用它。见https://www.dropbox.com/developers/blog/94/generate-an-access-token-for-your-own-account。

如果这是针对其他用户的,他们需要通过浏览器对您的应用进行一次授权,您才能获得 OAuth 令牌。但是,一旦获得令牌,您就可以继续使用它,因此每个用户只需执行一次。

【讨论】:

【参考方案6】:

抱歉,如果我遗漏了某些内容,但您不能只为您的操作系统下载 Dropbox 应用程序,然后将文件(在 Windows 中)保存在:

C:\Users\<UserName>\Dropbox\<FileName>

我刚刚创建了一个 python 程序来保存一个文本文件,检查了我的保管箱,它保存得很好。

【讨论】:

哈哈。是的,你是。 0riginal 海报正试图以编程方式执行此操作。 好吧,确切地说,这是一个有效的解决方案恕我直言。您可以“以编程方式”将文件保存在相应的目录中(我喜欢新词),然后 Dropbox 应用程序会将其与您的帐户同步,而无需进一步的用户交互。 问题是大多数人将他们的应用程序部署到服务器上,在这种情况下是另一台机器。 似乎可以通过将文件复制到计算机上的 `...Dropbox` 文件夹并让 Dropbox 桌面应用处理上传来处理上传。但是,在某些情况下我们不能这样做: 1) Dropbox 同步可能非常慢,根据我的经验,使用 API 上传文件要快得多。 2) 用户没有在他们的 PC 上安装桌面客户端。考虑一个拥有 3TB 帐户的人,他们想使用该帐户来归档价值 3TB 的文件。他们的 PC 必须有这么多可用的额外存储空间(忽略选择性同步等技巧)。【参考方案7】:

对于 Dropbox Business API,下面的 python 代码有助于将文件上传到 Dropbox。

def dropbox_file_upload(access_token,dropbox_file_path,local_file_name):
'''
The function upload file to dropbox.

    Parameters:
        access_token(str): Access token to authinticate dropbox
        dropbox_file_path(str): dropboth file path along with file name
        Eg: '/ab/Input/f_name.xlsx'
        local_file_name(str): local file name with path from where file needs to be uploaded
        Eg: 'f_name.xlsx' # if working directory
Returns:
    Boolean: 
        True on successful upload
        False on unsuccessful upload
'''
try:
    dbx = dropbox.DropboxTeam(access_token)
    # get the team member id for common user
    members = dbx.team_members_list()
    for i in range(0,len(members.members)):
        if members.members[i].profile.name.display_name == logged_in_user:
            member_id = members.members[i].profile.team_member_id
            break
    # connect to dropbox with member id
    dbx = dropbox.DropboxTeam(access_token).as_user(member_id)
    # upload local file to dropbox
    f = open(local_file_name, 'rb')
    dbx.files_upload(f.read(),dropbox_file_path)
    return True
except Exception as e:
    print(e)
    return False

【讨论】:

【参考方案8】:

这是在 windows 中使用 python 在 Dropbox 上上传 livevideo 的代码。 希望这会对你有所帮助。

import numpy as np
import cv2
import dropbox
import os
from glob import iglob


access_token = 'paste your access token here'   #paste your access token in-between ''
client = dropbox.client.DropboxClient(access_token)
print 'linked account: ', client.account_info()
PATH = ''

cap = cv2.VideoCapture(0)


# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('C:\python27\output1.avi',fourcc, 20.0, (640,480))

#here output1.avi is the filename in which your video which is captured from webcam is stored. and it resides in C:\python27 as per the path is given.

while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
#frame = cv2.flip(frame,0) #if u want to flip your video

# write the (unflipped or flipped) frame
out.write(frame)

cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

for filename in iglob(os.path.join(PATH, 'C:/Python27/output1.avi')):
print filename
try:
f = open(filename, 'rb')
response = client.put_file('/livevideo1.avi', f)
print "uploaded:", response
f.close()
#os.remove(filename)
except Exception, e:
print 'Error %s' % e

【讨论】:

检查您的 Dropbox 帐户是否正确上传。【参考方案9】:

这是在 windows 中使用 python 将现有视频上传到您的 Dropbox 帐户的代码。

希望这会对你有所帮助。

# Include the Dropbox SDK
import dropbox

# Get your app key and secret from the Dropbox developer website
app_key = 'paste your app-key here'
app_secret = 'paste your app-secret here'

flow = dropbox.client.DropboxOAuth2FlowNoRedirect(app_key, app_secret)

# Have the user sign in and authorize this token
authorize_url = flow.start()
print '1. Go to: ' + authorize_url
print '2. Click "Allow" (you might have to log in first)'
print '3. Copy the authorization code.'
code = raw_input("Enter the authorization code here: ").strip()

# This will fail if the user enters an invalid authorization code
access_token, user_id = flow.finish(code)

client = dropbox.client.DropboxClient(access_token)
print 'linked account: ', client.account_info()

f = open('give full path of the video which u want to upload on your dropbox account(ex: C:\python27\examples\video.avi)', 'rb')
response = client.put_file('/video1.avi', f) #video1.avi is the name in which your video is shown on your dropbox account. You can give any name here.
print 'uploaded: ', response

folder_metadata = client.metadata('/')
print 'metadata: ', folder_metadata

f, metadata = client.get_file_and_metadata('/video1.avi')
out = open('video1.avi', 'wb')
out.write(f.read())
out.close()
print metadata

现在上传图片,将使用相同的代码。

只写您要上传的图片文件名,例如: image.jpg 代替 video name 。还要更改 video1.avi 的名称,并为您上传的图像写入图像名称,其中您上传的图像将显示在您的 Dropbox 中,例如:image1.jpg。

【讨论】:

检查您的 Dropbox 帐户是否正确上传。

以上是关于从 python 脚本上传文件到我的 Dropbox的主要内容,如果未能解决你的问题,请参考以下文章

如何从 node.js 调用外部脚本/程序

8.5 Python 实例14-第三方库自动安装脚本

将谷歌应用程序脚本移动到 v8 文件上传停止从侧边栏工作

从文件名字符串PHP中删除空格[重复]

如何显示上传到我的 ftp 文件夹的图像

Google Forms文件上传完整示例