2

私はかなり長い間このトピックを検索してきましたが、私の問題を解決できるものは何も見つかりませんでした..だから私はあなたに頼ります!

ファイル ダイアログ ボックスを開いてファイルを選択する JSP があります。以前は、これを使用してファイルを指定したディレクトリ (コード内) にアップロードしていました。これはうまくいきます。現在、同じコードを使用して、適切なディレクトリで同じファイルを選択し、以下に含めたサーブレットに渡すことで、同じファイルを削除しようとしています。これを行うために、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 からファイルを保存する場所です。最初にディレクトリ内の DIFFERENT FILE を選択する限り、ハードコーディングされたディレクトリで storeFile に対してコメントアウトした行のコメントを解除すると、delete メソッドは正常に機能します。これにより、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

プラットフォームに依存しないソリューションはこのようなものであるため、ファイルを削除できます

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

ファイル パスがディレクトリの場合は注意してください。削除する前にディレクトリを空にする必要があります。 UploadFileorDelete

于 2013-08-04T06:59:14.733 に答える
1

ファイルをアップロードする目的は何ですか? すべてのファイルを内容別にチェックしますか?

より簡単な方法は、ファイル全体をアップロードしないことです。あなたがしたいことは、いくつかのコード - JSP/サーブレット - を呼び出し、パラメータとしてファイルの ID (ほとんどの場合はサーバー内のパス) を渡し、ファイルを削除させることです。アップロードされたすべてのファイルが同じフォルダーにある場合は、名前で十分です (*)。

結局のところ、ファイルをアップロードすることで、削除したいファイルのコピーを PC に保持することを余儀なくされます (ローカル ファイルを削除した場合はどうなるでしょうか? サーバー内のファイルを削除することはできませんか?)。

(*) 誰もパラメーターとして渡すことができないように、必ず安全チェックを実行..\..\WEB-INF\web.xmlしてください。

于 2013-01-17T23:53:02.967 に答える
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 に答える