1

在将文件上传到云存储位置后,我试图通过在标题中附加文件来删除文件。(上传过程成功)。但是上传成功后我无法删除文件。有什么办法可以通过休息后调用上传一个大文件(最大 150 MB),然后我需要删除该文件。

这是一个生产应用程序,所以我需要选择一个最佳解决方案。我正在使用上述方法,并且还考虑使用另一种方法进行测试 - 将文件转换为 MultipartFile,然后将其上传到云端。然后删除文件和 MultipartFile。


public void fileHandlingService(DocumentFileDetails documentFileDetails,UploadFileRequest uploadFileRequest){
 File file = new File(documentFileDetails.getFolderDirectory() + documentFileDetails.getFileName()
                + documentFileDetails.getFileExtension());
 uploadingFile(file,uploadFileRequest);

 //delete the file whether the upload is success or failure

 if (file.exists()) {
     //TODO unable to delete file here upload is successful but file resource is getting locked i guess
    FileUtils.forceDelete(file);
 }

}



public boolean uploadingFile(File file, UploadFileRequest uploadFileRequest) throws IOException {
        Resource fileResource=new FileSystemResource(file);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        PresignedFields fields = uploadFileRequest.getPresignedPost().getFields();
        //attaching some file details to the body
        //body.....

        body.add("Content-Disposition", "attachment; filename=\"" + uploadFileRequest.getFileName() + "\"");
        body.add("Content-Type", uploadFileRequest.getDocumentType());
        
        //file is getting upload to the cloud (need to upload file having size 150 mb)
        body.add("file", fileResource);

    

        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
        String serverUrl = uploadFileRequest.getPostUrl();
        try {
            ResponseEntity<Object> response = restTemplate.postForEntity(serverUrl, requestEntity, Object.class);
        
            if (response.getStatusCode() == HttpStatus.NO_CONTENT) {
                log.info("Successfully uploaded document", null);
                return true;
            }

            return false;
        } catch (Exception exception) {
            log.error("Exception when uploading file" + exception.getMessage(), null);
            throw new Exception(ErrorCode.FAILED_UPLOAD.getCode());
        }

    }

} 

使用上面的代码它在这一行失败并出现 IO 异常(猜测 fileSystemResource 没有释放文件的锁定)

FileUtils.forceDelete(file);

例外:

java.io.IOException: Cannot delete file: D:\TempFolder\TestFolder\Testfile.txt
    at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1344) ~[commons-io-2.11.0.jar:2.11.0]
4

1 回答 1

0

确定我自己的错误,所以回答我自己的问题。

FileUtils.forceDelete(文件);

如果该文件未打开或未被代码或机器在任何地方使用,则将删除该文件。

在我的情况下,这个文件被一些云存储同步操作(如谷歌驱动器)使用,它正在使用这个文件上传。所以 FileUtils 无法删除该文件。

通过不同步文件夹解决了这个问题。

于 2022-02-12T14:22:19.983 回答