我正在寻找一种从下载链接上传谷歌驱动器上的文件的方法。
我在文档中没有找到解释如何操作的内容。
编辑:
我发现了两种选择:
第一种解决方案似乎是最快的。当我从一个云到另一个云进行文件复制/粘贴时,例如使用可靠的资源管理器会更快。 必须有更好的解决方案吗?
@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;
}
..............
你能告诉我一个解决方案吗?
答案 0 :(得分:1)
您无法设置任意唯一ID。你有两个选择
保留为空。
最常见的机制是根本不设置任何ID。创建文件时,Google云端硬盘会创建一个ID并返回createdFile.id
。
请求ID缓存。
您可以使用https://developers.google.com/drive/v2/reference/files/generateIds获取一些ID,然后保留供您使用。您可以在body.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;
}
我希望这会有所帮助。