2

我一直在寻找这个主题很长一段时间,并没有找到任何能够解决我的问题的东西..所以我求助于你!

我有一个 JSP,我在其中打开一个文件对话框来选择一个文件。以前,我使用它来将文件上传到指定目录(在我的代码中)。这工作正常。我现在尝试使用相同的代码删除相同的文件,方法是在适当的目录中选择它并将其传递给我在下面包含的 servlet。我正在使用 Apache Common FileUpload 库来执行此操作。

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // checks if the request actually contains upload file
    if (!ServletFileUpload.isMultipartContent(request)) {
        // if not, we stop here
        return;
    }

    // configures some settings
    DiskFileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload delete = new ServletFileUpload(factory);

    // constructs the directory path to delete file
    String deletePath = UPLOAD_DIRECTORY;

    // parses the request's content to extract file data
    List formItems = delete.parseRequest(request);
    Iterator iter = formItems.iterator();

    // iterates over form's fields
    while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();


        // processes only fields that are not form fields
        if (!item.isFormField()) {


            String fileName = new File(item.getName()).getName();
            String filePath = deletePath + File.separator + fileName;
            File storeFile = new File(filePath);

            //File storeFile = new File("C:\\temp\\discLogo.txt");

            // deletes the file on disk
            boolean erased = storeFile.delete();
            }
        }

UPLOAD_DIRECTORY 是我从上传 JSP 存储文件的地方。如果我用硬编码目录取消注释我为 storeFile 注释掉的行,删除方法就可以正常工作,只要我最初在目录中选择一个不同的文件。这让我相信 HttpServletRequest 将文件保存在内存中的某个地方。

它是否正确?有什么办法可以释放它,以便我可以删除最初选择的文件?还是有更简单的方法来做到这一点?

谢谢!

4

4 回答 4

2

如果文件根本不存在(用于预先测试),或者文件被另一个应用程序甚至您自己的代码打开而被锁定,则将File#delete()返回!falseFile#exists()

如果此文件是由您自己的代码预先写入磁盘并保证不会在其他地方打开,那么您应该确保在写入文件内容后OutputStream#close()在块中调用。finally这个问题表明你没有。如果您在写入文件后保持打开状态,则在重新启动服务器/JVM 之前无法将其删除。

作为 FileUpload 的依赖项,您应该已经拥有 Apache Commons IO,它带有方便的实用方法,可减少文件复制和关闭样板文件。

InputStream input = item.getInputStream();
OutputStream output = new FileOutputStream(storeFile);

try {
    IOUtils.copy(input, output);
} finally {
    IOUtils.closeQuietly(output);
    IOUtils.closeQuietly(input);
}

也可以看看:

于 2013-01-18T00:21:20.220 回答
1

上传文件的对象是什么?您要按内容检查所有文件吗?

我想说更简单的方法是不上传整个文件。您要做的是调用一些代码 - JSP/Servlet - 作为参数传递文件的 ID(通常是服务器内部的路径)并使其删除文件。如果上传的所有文件都在同一个文件夹中,那么名称应该足够了(*)。

毕竟,通过上传文件,你是在强迫你在你的 PC 中拥有你想要删除的文件的副本(如果你删除了本地文件怎么办?你应该无法删除服务器中的文件吗?)

(*) 一定要执行安全检查,这样任何人都不能..\..\WEB-INF\web.xml作为参数传递。

于 2013-01-17T23:53:02.967 回答
1

您可以删除该文件,因为平台独立的解决方案是这样的

File deleteFile = new File(<file Path> ) ;
// check if the file  present or not
if( deleteFile.exists() )
deleteFile.delete() ;

注意如果文件路径是目录,那么在删除之前目录必须为空。 上传文件或删除

于 2013-08-04T06:59:14.733 回答
0

看起来我的问题出在我的 JSP 中。我最初有以下表格:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>File Delete</title>
</head>
<body>
    <form method="post" action="DeleteServlet"
        enctype="multipart/form-data">
        Select file to delete: <input type="file" name="dataFile"
            id="fileChooser" /><br />
        <br /> <input type="submit" value="Delete" />
    </form>
</body>
</html>

我通过encytype="multipart/form-data"从表单中删除来更改它,然后能够使用 request.getParameter("dataFile") 来获取文件名。

于 2013-01-18T21:18:59.703 回答