使用apache commons FileUpload的Java Servlet JSP删除文件

时间:2013-01-17 23:46:42

标签: java jsp servlets

我一直在搜索这个话题已经有一段时间了,并没有找到任何能够解决我问题的东西..所以我转向你!

我有一个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 个答案:

答案 0 :(得分:2)

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

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

Apache Commons IO,你应该已经拥有FileUpload的依赖,它带有方便的实用工具方法,可以减少文件复制并关闭样板文件。

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

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

另见:

答案 1 :(得分:1)

上传文件的目的是什么?你打算按内容检查所有文件吗?

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

毕竟,通过上传文件,您强制要在PC中复制要删除的文件(如果删除了本地文件,该怎么办?您是否应该删除服务器中的文件? )

(*)请务必执行安全检查,以便任何人都不能将..\..\WEB-INF\web.xml作为参数传递。

答案 2 :(得分:1)

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

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

如果文件路径是目录,请小心,然后在删除之前目录必须为空。 UploadFileorDelete

答案 3 :(得分:-1)

看起来我的问题出在我的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”)来获取文件名。