无法使用react-native-blob-util将数据上传到Dropbox

问题描述 投票:0回答:1

我正在尝试使用

react-native-blob-util
将一个相当大的文件(~100mb,SQLite 数据库)上传到 Dropbox。我通过 Dropbox 进行身份验证以获得访问令牌
react-native-app-auth
。我从
react-native-blob-util
得到的回应是它有效:它进入
then block
。当我
console.log()
res
时,我得到了这个(
data
道具看起来很可疑):

{"array": [Function anonymous], "base64": [Function anonymous], "blob": [Function anonymous], "data": "Error in call to API function \"files/upload\": Invalid authorization value in HTTP header \"Authorization\": \"sl.Bl...\".  Expecting \"Bearer <oauth2-access-token>\".", "flush": [Function anonymous], "info": [Function anonymous], "json": [Function anonymous], "path": [Function anonymous], "readFile": [Function anonymous], "readStream": [Function anonymous], "respInfo": {"headers": {"Accept-Encoding": "identity,gzip", "Cache-Control": "no-cache", "Connection": "close", "Content-Encoding": "gzip", "Content-Security-Policy": "sandbox allow-forms allow-scripts", "Content-Type": "text/plain; charset=utf-8", "Date": "Sun, 10 Sep 2023 08:21:22 GMT", "Server": "envoy", "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", "Transfer-Encoding": "Identity", "Vary": "Accept-Encoding", "X-Content-Type-Options": "nosniff", "X-Dropbox-Request-Id": "0d608050e40b41b79033ad96f82c1fac", "X-Dropbox-Response-Origin": "far_remote", "X-Robots-Tag": "noindex, nofollow, noimageindex"}, "redirects": ["https://content.dropboxapi.com/2/files/upload"], "respType": "text", "rnfbEncode": "utf8", "state": "2", "status": 400, "taskId": "...", "timeout": false}, "session": [Function anonymous], "taskId": "xxn9ye010qjh2yjcrl8u8", "text": [Function anonymous], "type": "utf8"}

此外,还有

a) 我的 Dropbox 中没有任何内容(尽管有应用程序文件夹) b) 上传大约需要 1 秒,对于 ~100mb 来说太短了。

这是代码。

  const _authenticateDropbox = async () => {
    const config = {
      clientId: '...',
      clientSecret: '...',
      redirectUrl: 'org.reactjs.native.example..../oauth',
      scopes: [],
      serviceConfiguration: {
        authorizationEndpoint: 'https://www.dropbox.com/oauth2/authorize',
        tokenEndpoint: `https://www.dropbox.com/oauth2/token`,
      },
      additionalParameters: {
        token_access_type: 'offline',
      },
    };
    try {
      const user = await authorize(config);
      if (user) {
        if (user.accessToken) _uploadData(user.accessToken);
      }
    } catch (error) {
      console.warn('Something went wrong logging in into Dropbox, ', error);
    }
  };

  const _uploadData = accessToken => {
    const dbName = `${DATABASE_NAME}.db`;
    const databasePath = `${RNFS.DocumentDirectoryPath}/${dbName}`;

      ReactNativeBlobUtil.fetch(
        'POST',
        'https://content.dropboxapi.com/2/files/upload',
        {
          Authorization: accessToken,
          'Dropbox-API-Arg': JSON.stringify({
            path: '/foo.db',
            mode: 'add',
            autorename: true,
            mute: false,
          }),
          'Content-Type': 'application/octet-stream',
        },
        ReactNativeBlobUtil.wrap(databasePath),
      )
        .uploadProgress({interval: 250}, (written, total) => {
          ...
        })
        .then(res => {
          console.log(res)
          console.log(accessToken) // its not empty, a looong string starting with sl.BlwH...
        })
        .catch(error => {
          console.warn(error) // not logging
        });
  };

如果我做一个

const databaseExists = await RNFS.exists(databasePath);
console.log(databaseExists); // true

它记录了

true
,所以路径是正确的。 当我检查文件的大小时(只是为了确保这不是空文件)

ReactNativeBlobUtil.fs
  .stat(databasePath)
  .then(stats => {
    console.log(stats);
  })
  .catch(err => {
    console.warn(err);
  });

它回来了

{"filename": "foo.db", "lastModified": 1694194258000, "path": "/Users/.../Library/Developer/CoreSimulator/Devices/3B433335-5FEA-4324-BCD4-4CBB677C5A4E/data/Containers/Data/Application/98544ECA-3FDF-4D24-AEB8-F1015E2BEEAD/Documents/foo.db", "size": 108924928, "type": "file"}

因此文件存在并且具有大小。

我错过了什么?

版本:

"react-native": "0.71.7",
"react-native-blob-util": "^0.19.1"
"react-native-app-auth": "^7.0.0",
javascript react-native dropbox-api react-native-fetch-blob
1个回答
0
投票

授权标头应如下所示

Authorization: `Bearer ${accessToken}`,
© www.soinside.com 2019 - 2024. All rights reserved.