我们正在使用 apex 将文件上传到 Google Drive 的文件夹,并提供文件夹 ID 并发送请求。调试http请求后,我们可以看到请求良好并且获取的文件夹ID是正确的。但文件未上传到文件夹内部,而是上传到文件夹外部和驱动器内部其他位置。请帮助我们了解错误。无法理解问题出在哪里。
这是代码。 `
String boundary = '----------9889464542212';
String delimiter = '\r\n--' + boundary +'\r\n';
String close_delim = '\r\n--' + boundary + '--';
String bodyEncoded = EncodingUtil.base64Encode(att.Body);
String FolderId= '1U0vuP53dpIAM_WlmbJfvwvMCK0XZREOo';
String body=delimiter+'Content-Type: application/pdf\r\n\r\n'+'{ "title" : "'+ filename+'",'+' "mimeType" : "' + att.ContentType+ '",'+ '"parents":[{"id":"'+ FolderId +'"}] }' + delimiter+'Content-Type: ' + att.ContentType +'\nContent-Transfer-Encoding: base64\r\n'+'\r\n'+ '\r\n'+bodyEncoded+close_delim;
`
这是请求:`------------9889464542212 内容类型:应用程序/pdf
{ "title": "tester 83_Resume", "mimeType": "application/pdf","parents":[{"id":"1U0vuP53dpIAM_WlmbJfvwvMCK0XZREOo"}] } ------------9889464542212 内容类型:应用程序/pdf 内容传输编码:base64 `
以下是与请求相比具有不同父 ID 的响应:"createdDate": "2018-01-17T11:05:15.699Z",
"修改日期": "2018-01-17T11:05:15.699Z",
"modifiedByMeDate": "2018-01-17T11:05:15.699Z",
"lastViewedByMeDate": "2018-01-17T11:05:15.699Z",
"markedViewedByMeDate": "1970-01-01T00:00:00.000Z",
“版本”:“2”,
“ parent ”: [
{
“kind”:“drive#parentReference”,
"id": "0ABNzkfZayN4oUk9PVA",
“selfLink”:“https://www.googleapis.com/drive/v2/files/1SBy8FSshEm9FgHdX_9cP9ZY0bbRiw9Ni/parents/0ABNzkfZayN4oUk9PVA”,
“parentLink”:“https://www.googleapis.com/drive/v2/files/0ABNzkfZayN4oUk9PVA”,
“isRoot”:正确
}
],
最佳答案
遇到了同样的问题。它已上传到根驱动器目录,而不是您提供的父目录。它看起来像你的 parents content json is allright 。看起来您正在使用分段上传,这可能存在问题。下面在 Android 上使用 okhttp3 生成的基本请求似乎可以正常工作。这是一个简单的基本请求,没有使用任何库。
工作要求:
POST https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart
Accept: application/json
Content-Type: multipart/related
Authorization: Bearer ya29.c.El__BV-q0dMeaVNil2kcVYUkpZmeEW85rjV6hRdgsoIeXbl-pFeEAaJuqcUSwok63JcnKg
body: --hkj_multipart_data
Content-Disposition: form-data; name="metadata"
Content-Type: application/json; charset=utf-8
Content-Length: 298
{"title":"3628360894d8f16bc-08c9-4021-b417-d18f693a6ee2_20180707033608.JPG","mimeType":"image/jpeg","description":"AndroidTest uploaded 3628360894d8f16bc-08c9-4021-b417-d18f693a6ee2_20180707033608.JPG","parents":[{"id":"1w8APlCLvop42O3DiddkITKc63zGk0Yt4A"}]}
--hkj_multipart_data
Content-Disposition: form-data; name="file"
Content-Transfer-Encoding: base64
Content-Type: image/jpeg; charset=utf-8
Content-Length: 5339083
[BASE64 ENCODED STRING]/9j/4TUMRXhpZgAASUkqAAgAAAAMAAABBAABAAAAwBQAAAEBBAABAAAArAsAAA8BAgAIAAAAngAA
ABABAgAJAAAApgAAABIBAwABAAAABgAAABoBBQABAAAA0gAAABsBBQABAAAA2gAAACgBAwABAAAA
AgAAADEBAgAOAAAAsAAAADIBAgAUAAAAvgAAABMCAwABAAAAAQAAAGmHBAABAAAA4gAAAB4DAABz
YW1zdW5nAFNNLUc5MzBGAABHOTIwRlhYVTVFUUU3ADIwMTg6MDc6MDcgMTU6MzY6MDgASAAAAAEA
AABIAAAAAQAAABo
回应:
{
"kind": "drive#file",
"id": "1PTU_N4JEd8EIpj31bsNDMOx5et15VJW",
"etag": "\"Kk_83xxobVILlgYUB8xd9E4tSOE/ZCHdcOb2Zhti8IgKqfYv\"",
"selfLink": "https://www.googleapis.com/drive/v2/files/1PTU_N4JEd8EIpj31bsNDMOx5et15VJW",
"webContentLink": "https://drive.google.com/uc?id=1PTU_N4JEd8EIpj31bsNDMOx5et15VJW&export=download",
"alternateLink": "https://drive.google.com/file/d/1PTU_N4JEd8EIpj31bsNDMOx5et15VJW/view?usp=drivesdk",
"embedLink": "https://drive.google.com/file/d/1PTU_N4JEd8EIpj31bsNDMOx5et15VJW/preview?usp=drivesdk",
"iconLink": "https://drive-thirdparty.googleusercontent.com/16/type/image/jpeg",
"thumbnailLink": "https://lh3.googleusercontent.com/7Zd1aZsFxdVackbhnAqaJrc5geBSrqQOaJUXaywQMRjRr9i6ml56k7u0Cbow_Y6FAHpWmLdYvrKSo=s220",
"title": "3628360894d8f16bc-08c9-4021-b417-d18f693a6ee2_20180707033608.JPG",
"mimeType": "image/jpeg",
"description": "AndroidTest uploaded 3628360894d8f16bc-08c9-4021-b417-d18f693a6ee2_20180707033608.JPG",
"copyRequiresWriterPermission": false,
"createdDate": "2018-07-21T08:47:13.955Z",
"modifiedDate": "2018-07-21T08:47:13.955Z",
"version": "2",
"parents": [
{
"kind": "drive#parentReference",
"id": "1w8APlCLvop42O3DiddkITKc63zGk0Yt4A",
"selfLink": "https://www.googleapis.com/drive/v2/files/1PTU_N4JEd8EIpj31bsNDMOx5et15VJW/parents/1w8APlCLvop42O3DiddkITKc63zGk0Yt4A",
"parentLink": "https://www.googleapis.com/drive/v2/files/1w8APlCLvop42O3DiddkITKc63zGk0Yt4A",
"isRoot": false
}
],
"downloadUrl": "https://doc-0g-84-docs.googleusercontent.com/docs/securesc/bfl87khmp0ji0o8234fefb9j8tg2e8eq/0afho4f4lpjh2fc86pamub3m932ml45e/1532160000000/3453454378456732326/3453454378456732326/1PTU_N4JEd8EIpj31bsNDMOx5et15VJW?e=download&gd=true",
"userPermission": {
"kind": "drive#permission",
"etag": "\"Kk_83xxobVILlgYUB8xd9E4tSOE/t3z1cT1lHlrhFSOpyQWJMD-ZlW8\"",
"id": "me",
"selfLink": "https://www.googleapis.com/drive/v2/files/1PTU_N4JEd8EIpj31bsNDMOx5et15VJW/permissions/me",
"role": "owner",
"type": "user"
},
"originalFilename": "3628360894d8f16bc-08c9-4021-b417-d18f693a6ee2_20180707033608.JPG",
"fileExtension": "JPG",
"md5Checksum": "67c38d5121b983b9be4bad3d291f1ec5",
"fileSize": "3952306",
"quotaBytesUsed": "3952306",
"ownerNames": [
"nameoftheserviceaccount@norme-naming-space.iam.gserviceaccount.com"
],
"owners": [
{
"kind": "drive#user",
"displayName": "nameoftheserviceaccount@norme-naming-space.iam.gserviceaccount.com",
"isAuthenticatedUser": true,
"permissionId": "3453454378456732326",
"emailAddress": "nameoftheserviceaccount@norme-naming-space.iam.gserviceaccount.com"
}
],
"lastModifyingUserName": "nameoftheserviceaccount@norme-naming-space.iam.gserviceaccount.com",
"lastModifyingUser": {
"kind": "drive#user",
"displayName": "nameoftheserviceaccount@norme-naming-space.iam.gserviceaccount.com",
"isAuthenticatedUser": true,
"permissionId": "3453454378456732326",
"emailAddress": "nameoftheserviceaccount@norme-naming-space.iam.gserviceaccount.com"
},
"capabilities": {
"canCopy": true,
"canEdit": true
},
"editable": true,
"copyable": true,
"writersCanShare": true,
"shared": true,
"explicitlyTrashed": false,
"appDataContents": false,
"headRevisionId": "0B277NX55uQ91SkY4NVRxMSs5cWNDQWdPckwwMTlEWVFwNExBPQ",
"imageMediaMetadata": {
"width": 5312,
"height": 2988,
"rotation": 1,
"date": "2018:07:07 15:36:08",
"cameraMake": "samsung",
"cameraModel": "SM-G930F",
"exposureTime": 0.02,
"aperture": 1.9,
"flashUsed": false,
"focalLength": 4.3,
"isoSpeed": 200,
"meteringMode": "CenterWeightedAverage",
"exposureMode": "Auto",
"colorSpace": "sRGB",
"whiteBalance": "Auto",
"exposureBias": 0.0,
"maxApertureValue": 1.85
},
"spaces": [
"drive"
]
}
用于生成请求的 Java android 代码 ( okhttp 3.10.0 ):
String fileMimeType = "image/jpeg";
String metaDataFile = "{\"title\":\"" + filename + "\"," +
"\"mimeType\":\"" + fileMimeType + "\"," +
"\"description\":\"" +account.getName() + " uploaded " + filename + "\"," +
"\"parents\":[{\"id\":\"" + account.getUploadFolderID() + "\"}]" +
"}";
RequestBody requestBodyMetaData = RequestBody.create(JSON, metaDataFile);
RequestBody requestBodyFile = RequestBody.create(fileMimeType, BitmapUtils.getBase64(sourceFile));
MultipartBody.Part requestBodyFilePart = MultipartBody.Part.create(Headers.of("Content-Disposition", "form-data; name=\"file\"", "Content-Transfer-Encoding", "base64"), requestBodyFile);
RequestBody requestBodyMultipart = new MultipartBody.Builder("hkj_multipart_data")
.setType(MultipartBody.FORM)
.addFormDataPart("metadata", null, requestBodyMetaData)
.addPart(requestBodyFilePart)
.build();
request = new Request.Builder()
.url(HKJConstants.GOOGLE_UPLOAD_API_SERVER_BASE_URL + "files?uploadType=multipart")
.header("Accept", "application/json")
.header("Content-Type", "multipart/related")
.addHeader("Authorization", "Bearer " + accessToken)
.post(requestBodyMultipart)
.build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
if (response.isSuccessful()) {
GoogleDriveFileList googleDriveFileListResult = new Gson().fromJson(response.body().charStream(), GoogleDriveFileList.class);
if(googleDriveFileListResult.IsFilled()){
return true;
}
}
关于java - 尝试将文件上传到 Google 云端硬盘的特定文件夹。尽管 http 请求具有正确的文件夹 ID,但它还是被上传到文件夹之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48299734/