从Java应用程序

时间:2018-06-17 15:30:05

标签: java sharepoint upload onedrive

我正在尝试使用Java应用程序将文件上传到OneDrive,并且我对这个过程有点挣扎。我认为我的主要问题是我没有像微软定义的那样获得驱动和文件夹概念。所以我无法看到上传到的URL应该是什么。

现在,只要将文件上传到我自己的OneDrive文件夹,只要登录公司的“Sharepoint”网站,我就会欣喜若狂。所以这不是个人OneDrive上传。 最终,虽然我需要能够构建一个指向要求存放文件的文件夹的URL。

搜索WEB(和Stackoverflow)我发现人们指定了两种不同类型的URL来上传文件。

  1. https://apis.live.net/v5.0/me/skydrive/files?access_token=“+ sAccessToken - 第一个似乎是一个MS网址,以某种方式可以弄清楚我的文件夹是什么。
  2. https://mycompanyname.sharepoint.com/me/drive?access_token=“+ sAccessToken - 这个特定于我的公司。在我的脑海中指向我的默认目录。但对于我的生活,我无法让它工作。即使在Chrome Postman,更不用说在我的Java应用程序。
  3. 我一直收到401或404错误。现在401是授权错误,所以我认为这是一个URL问题。好吧,因为我创建了应用程序并自己赋予了ReadWrite权限。我使用此应用程序中的秘密来获取可行的AccessKey。 所以我的猜测是我访问了一个不正确的文件夹,即不是我的,而是其他人的,因此我收到了401消息。

    我没有提出Java代码,因为我甚至无法在Postman中使用它。所以,如果我遗漏了任何东西,请告诉我。

    提前谢谢所有人

1 个答案:

答案 0 :(得分:0)

根据One Drive API documentation,可以使用以下3种方法将文件上传到One Drive个人:

  • 简单上传:(当然,要上传的文件大小有所限制)

    我们只需要将带有扩展名的文件名作为url参数的路径参数,将实际文件作为二进制附件传递给正文。

file name with extension as a path parameter request body as a binary attachment

完成简单的上传即可。

注意: 如果要将文件上传到除以下目录之外的目录中,则可以在URL中提及特定目录的ID而不是“ root”根目录。

  • 分段上传:(此策略对要上传的文件也有大小限制)只有在单个api调用中要上传文件内容+文件元数据时,才应采用这种方法。

Request url and headers for multipart upload on One Drive

Request body payload for multipart upload on One Drive

这对我不起作用,因为未在一个驱动器服务器上解码的情况下上传了以64为基数编码的有效负载,因此上传的文件不可预览。似乎一个驱动器正在忽略Content-Encoding-Scheme标头(可能是一个错误),或者根本不支持此标头。 :(

请让我知道您是否能够修复它。

有效载荷中的内容得到了适当的修饰,但是由于它忽略了媒体文件的内容编码方案, 内容被升级为基本64位编码的内容,无法在一个驱动器中预览。

点击下面的链接以了解有关此问题的更多信息:

Stackoverflow

Microsoft forum

  • 会话上传(用于大文件):在这里,您需要创建一个上传会话,然后将数据分块上传到创建的会话中。有关更多详细信息,请单击此链接Session Upload

Creating upload session

Uploading data to created session in chunks

并将文件附加为二进制附件。

这些全部用于POSTMAN客户端。

如果您希望使用Java代码上载相同的代码,则以下示例代码可能会有所帮助: Sample upload application

@RequestMapping(value="/upload", method=RequestMethod.POST, consumes=MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
    File convertFile = new File("FileDirectoryPath"+file.getOriginalFilename());
    //convertFile.createNewFile();
    FileOutputStream fos = new FileOutputStream(convertFile);
    fos.write(file.getBytes());
    fos.close();
    return new ResponseEntity<>("file uploaded successfully", HttpStatus.OK);
}