【问题标题】:Files remain open/locked in Azure Function - unable to delete文件在 Azure 函数中保持打开/锁定 - 无法删除
【发布时间】:2020-08-28 00:10:29
【问题描述】:

我的程序使用library 将位于 Azure 文件共享中的文件上传到 Sharepoint,然后从 Azure 文件共享中删除该文件。以下是我的代码的一小部分(相关);当我运行它时,文件被正确上传,但之后没有被删除 没有被删除,因为它仍在被 SMB 客户端使用(它被“标记为删除”,但只有在禁用 Azure 功能后才会被删除)。

我的猜测是,由于在 wrapper.uploadFile 中打开了 InputStream,但可能没有关闭,但 resource.isOpen() 总是返回 false

ma​​in.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;
        }

【问题讨论】:

  • file.delete(); - 这是真的吗?

标签: java azure azure-functions


【解决方案1】:

在您的 wrapper.upload 文件中,添加 resource.getInputStream().close() 并检查是否有效。

【讨论】:

  • 我在我的系统中检查了它,它工作正常。然后,您使用的 SMB 客户端可能会保持流打开。您可以尝试处置 PLGSharepointClient 吗?
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2018-06-28
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多