#java #azure #azure-functions
#java #azure #azure-функции
Вопрос:
Моя программа использует библиотеку для загрузки файла, расположенного в общей папке Azure, в Sharepoint, после чего файл удаляется из общей папки Azure. Ниже приведена небольшая (соответствующая) часть моего кода; когда я запускаю его, файл загружается правильно, но не удаляется впоследствии, не удаляется, потому что он все еще используется клиентом SMB (он «помечен для удаления», но удаляется только после отключения функции Azure).
Я предполагал, что, поскольку InputStream открыт в wrapper.uploadFile, но не закрыт, это может быть так, но resource.isOpen()
всегда возвращается false
main.class
File file = new File (filepath);
Resource resource = new FileSystemResource(filepath);
PLGSharepointClient wrapper = new PLGSharepointClient(user, passwd, domain, spSiteUrl);
JSONObject jsonMetadata = new JSONObject();
wrapper.uploadFile(spFolder, resource, jsonMetadata);
resource.getInputStream().close();
System.out.println(resource.isOpen());
file.delete();
wrapper.uploadFile
public JSONObject uploadFile(String folder, Resource resource, JSONObject jsonMetadata) throws Exception {
LOG.debug("Uploading file {} to folder {}", resource.getFilename(), folder);
JSONObject submeta = new JSONObject();
submeta.put("type", "SP.ListItem");
jsonMetadata.put("__metadata", submeta);
headers = headerHelper.getPostHeaders("");
headers.remove("Content-Length");
byte[] resBytes = IOUtils.readFully(resource.getInputStream(), (int) resource.contentLength());
RequestEntity<byte[]> requestEntity = new RequestEntity<>(resBytes,
headers, HttpMethod.POST,
this.tokenHelper.getSharepointSiteUrl(
"/_api/web/GetFolderByServerRelativeUrl('" UriUtils.encodeQuery(folder, StandardCharsets.UTF_8) "')/Files/add(url='"
UriUtils.encodeQuery(resource.getFilename(), StandardCharsets.UTF_8) "',overwrite=true)"
)
);
ResponseEntity<String> responseEntity =
restTemplate.exchange(requestEntity, String.class);
String fileInfoStr = responseEntity.getBody();
LOG.debug("Retrieved response from server with json");
JSONObject jsonFileInfo = new JSONObject(fileInfoStr);
String serverRelFileUrl = jsonFileInfo.getJSONObject("d").getString("ServerRelativeUrl");
LOG.debug("File uploaded to URI", serverRelFileUrl);
String metadata = jsonMetadata.toString();
headers = headerHelper.getUpdateHeaders(metadata);
LOG.debug("Updating file adding metadata {}", jsonMetadata);
RequestEntity<String> requestEntity1 = new RequestEntity<>(metadata,
headers, HttpMethod.POST,
this.tokenHelper.getSharepointSiteUrl("/_api/web/GetFileByServerRelativeUrl('" UriUtils.encodeQuery(serverRelFileUrl, StandardCharsets.UTF_8) "')/listitemallfields")
);
ResponseEntity<String> responseEntity1 =
restTemplate.exchange(requestEntity1, String.class);
LOG.debug("Updated file metadata Status {}", responseEntity1.getStatusCode());
return jsonFileInfo;
}
Комментарии:
1. файл. удалить(); — это правда?
Ответ №1:
В вашем файле wrapper.upload добавьте resource.getInputStream().close()
и проверьте, работает ли это.
Комментарии:
1. Я проверил это в своей системе, это сработало. Тогда, возможно, используемый вами SMB-клиент поддерживает поток открытым. Можете ли вы попробовать удалить PLGSharepointClient?