如何上传包含Google Drive REST API v2链接的文件

时间:2017-06-21 09:35:22

标签: java android rest api google-drive-api

我正在寻找一种从下载链接上传谷歌驱动器上的文件的方法。

我在文档中没有找到解释如何操作的内容。

编辑:

我发现了两种选择:

  • 第一个是从循环中输出createdFile
  • 第二个是第一次迭代,以恢复文件的ID,然后进行更新。

第一种解决方案似乎是最快的。当我从一个云到另一个云进行文件复制/粘贴时,例如使用可靠的资源管理器会更快。 必须有更好的解决方案吗?

    @Override
    protected String doInBackground(String... sUrl) {
        File body = new File();
        body.setTitle("some name");
        String fileId = null;
        File createdFile;
        InputStream input = null;
        ByteArrayOutputStream bos = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            // download the file
            input = connection.getInputStream();
            bos = new ByteArrayOutputStream();

            byte data[] = new byte[4096];
            total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;

                bos.write(data, 0, count);
                //option 2
                if (fileId == null){
                    createdFile = mService.files().insert(body, new ByteArrayContent("", bos.toByteArray())).execute();
                    fileId = createdFile.getId();

                }else{
                    createdFile = mService.files().update(fileId, createdFile, new ByteArrayContent("", bos.toByteArray())).execute();
                }

            }
            //option 1
            createdFile = mService.files().insert(body, new ByteArrayContent("", bos.toByteArray())).execute();
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (bos != null)
                    bos.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
    ..............

你能告诉我一个解决方案吗?

2 个答案:

答案 0 :(得分:1)

您无法设置任意唯一ID。你有两个选择

  1. 保留为空。 最常见的机制是根本不设置任何ID。创建文件时,Google云端硬盘会创建一个ID并返回createdFile.id

  2. 请求ID缓存。 您可以使用https://developers.google.com/drive/v2/reference/files/generateIds获取一些ID,然后保留供您使用。您可以在body.id

  3. 中设置其中一个ID

    但是,我怀疑你真正的问题是你还没有理解文件ID与文件名的重要性。在Google云端硬盘中,文件由其ID标识,而不是其名称。文件名只是文件的属性,就像修改日期和mime类型一样。如果您创建10,您将获得10个文件。如果那些创建的都具有相同的名称,请猜测,10个文件中的每个文件都具有相同的名称。

    如果您打算更新同一个文件,而不是创建一个新文件,那么您应该使用https://developers.google.com/drive/v2/reference/files/update而不是Create。

答案 1 :(得分:0)

最后我继续这样做:

@Override
    protected String doInBackground(String... sUrl) {

        com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
        body.setTitle("some name");
        InputStream input = null;
        InputStreamContent mediaContent = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            if (cookies != null){
                connection.setRequestProperty("Cookie", cookies);
                connection.setRequestProperty("User-Agent", agent);
                connection.setRequestProperty("Accept", "text/html, application/xhtml+xml, *" + "/" + "*");
                connection.setRequestProperty("Accept-Language", "en-US,en;q=0.7,he;q=0.3");
                connection.setRequestProperty("Referer", sUrl[0]);
            }
            connection.connect();

            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            input = connection.getInputStream();

            mediaContent = new InputStreamContent("", new BufferedInputStream(connection.getInputStream()) {
                @Override
                public int read() throws IOException {

                    return 0;
                }
                @Override
                public int read(byte[] buffer,
                                int byteOffset, int byteCount)
                        throws IOException {

                    return super.read(buffer, byteOffset, byteCount);
                }
            });

            com.google.api.services.drive.model.File f = mService.files().insert(body, mediaContent).execute();

        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }

我希望这会有所帮助。