我会把我的代码放在第一位:
@Post
public Representation post(InputStream zip) throws Throwable {
createFile(zip, "C:/temp\abc.zip");
return new StringRepresentation("File uploaded");
}
public void createFile(InputStream zipStream, uploadedFileLocation) throws Exception {
try {
writeToFile(zipStream, uploadedFileLocation);
FileUtils.forceDelete(new File(uploadedFileLocation));
} catch (Exception e) {
throw e;
}
}
private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) {
try {
OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
int read = 0;
byte[] bytes = new byte[1024];
out = new FileOutputStream(new File(uploadedFileLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
uploadedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我正在尝试创建一个允许用户上传zip文件的服务器。然后服务器将zip文件写入磁盘,解压缩,然后删除zip,同时保持服务器上的解压缩部分。但是,当我将zip文件发送到我的服务器时,它无法删除。使用FileUtils.forceDelete()
时,它表示无法删除文件。解压后拉链是理想的选择。
编辑:我只能在post(InputStream zip)
返回后删除该文件。如果我在post
方法中调用delete,则不会删除,因为post尚未返回。有办法解决这个问题吗?
答案 0 :(得分:1)
<击>嗯。您似乎正在尝试删除目录?
FileUtils.forceDelete(new File(uploadedFileLocation));
但 uploadedFileLocation
方法中post
为“C:\ temp”。我不确定这是否会导致问题,或者这是否是预期的行为,但该代码不会删除zip文件,并且正在尝试删除实际的C:\ temp目录。
此外,值得注意的是:在writeToFile
方法中,您要初始化OutputStream out
两次。我不是百分之百,但可能是第一次初始化是保持文件指针打开,直到从堆栈中删除整个对象(即,当post
返回时)。取出第二次初始化并查看是否发生了任何变化?
答案 1 :(得分:0)
我猜您的问题可能是由于您使用“C:/ temp”而不是“C:/ temp / fileName”引起的,所以您最终会尝试删除一个您可能没有权限的文件夹。
答案 2 :(得分:0)
您不需要使用文件位置,为什么不使用实际文件?
将文件作为参数传递,并在完成后执行file.delete();
。
答案 3 :(得分:0)
如果问题不在于您尝试删除目录,那么您尝试删除的文件很可能仍处于打开状态。在Windows上,这意味着将阻止您删除该文件。
根据它的外观,您的writeToFile
方法会打开文件两次......但只关闭一次。我怀疑这意味着它会泄漏文件描述符,操作系统会认为应用程序仍在使用该文件。
事实证明我应该调用file.delete();而不是使用FileUtils。
我不这么认为。当然,由于文件未被删除,您不会获得异常。但是File.delete()
将返回false
,您的应用程序将把文件留在文件系统中。从长远来看,这可能会更糟,除非你已经有其他东西来清除孤立的文件。