java - 尝试将文件上传到 Google 云端硬盘的特定文件夹。尽管 http 请求具有正确的文件夹 ID,但它还是被上传到文件夹之外

标签 java salesforce apex

我们正在使用 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/

相关文章:

java - 如何从 CSV 数据的第二行开始扫描到链接列表?

azure - OpenID Connect提示参数: SHOULD vs MUST

python - 导入 Apex 时出现 `UnencryptedCookieSessionFactoryConfig` 错误

testing - 如何为 Salesforce 进行 MultiMock Http 标注测试?

java - 为什么 java.time.LocalDateTime 不提供 toDate() 方法?

java - 如何从链接到字符串读取/解析文章内容

java - 如何从java程序打印.exe printf()消息

salesforce - 如何使用 SOQL 从force.com 数据库请求单个随机行?

java - Apex 可调度类 : SendEmail failed INVALID_SA​VE_AS_ACTI​VITY_FLAG saveAsActi​vity must be false

testing - Salesforce/Apex,为什么 TestDataFactory 类包含在代码覆盖率中?