Файлы остаются открытыми / заблокированными в функции Azure — невозможно удалить

#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?