1

ダウンロードファイルに次のコードを使用する

<%@page import="java.nio.channels.OverlappingFileLockException"%>
<%@page import="java.nio.channels.FileLock"%>
<%@page import="java.nio.channels.FileChannel"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page contentType="application/octet-stream"%>
<%@page pageEncoding="UTF-8"%>
<%@page language="java" import="java.io.*,java.net.*,java.util.*,javax.servlet.*"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>JSP Page</title>
    </head>
    <body>
        <%

        BufferedInputStream filein = null;
        BufferedOutputStream output = null;
        try {

            File file = new File("d:/ttt.mp3"); // path of file
            if (file.exists()) {


                byte b[] = new byte[2];        
                int len = 0;
                filein = new BufferedInputStream(new FileInputStream(file));
                output = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/force-download");
                response.setHeader("content-Disposition", "attachment; filename=Backup.gz");
                response.setHeader("content-Transfer-Encoding", "binary");
                while ((len = filein.read(b)) > 0) {
                    output.write(b, 0, len);

                    output.flush();

                 //   output.close();

                }


                Calendar present = Calendar.getInstance();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String a = sdf.format(present.getTime());
                String ip = request.getRemoteAddr();
                String mail = session.getAttribute("emailid").toString();
                try {
                    PreparedStatement pst = null;
                    String connectionURL = "jdbc:mysql://localhost/logapp_log";
                    Connection connection = null;
                    Class.forName("com.mysql.jdbc.Driver").newInstance();
                    connection = (Connection) DriverManager.getConnection(connectionURL, "root", "nic@123");
                    String query = "insert into logapp_log_table(uname,date_time,user_ip) values ('" + mail + "','" + a + "','" + ip + "')";
                    pst = connection.prepareStatement(query);
                    pst.executeUpdate();
                    pst.close();
                    connection.close();
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            } else {
                session.setAttribute("Ferror", "File not available Or Deleted");
                getServletContext().getRequestDispatcher("/link.jsp").forward(request, response);
            }

        } catch (Exception ex) {
            System.out.print(ex.getMessage());
        }

    %>
</body>

このコードは正常に動作します...ダウンロード後にそのファイルを削除するためのコードの下...

File file = new File("d:/ttt.mp3");
       if(file.exists()) { 

        if (file.delete()) {

            System.out.println("File Deleted");
            session.setAttribute("Ferror","Deleted");
            getServletContext().getRequestDispatcher("/link.jsp").forward(request, response);
            response.sendRedirect("login.jsp");
        } else {
            System.out.println("Delete failed");
            session.setAttribute("Ferror","Under Process");
            getServletContext().getRequestDispatcher("/link.jsp").forward(request, response);
        }
       }
       else {


           session.setAttribute("Ferror","File not available Or Deleted");
           getServletContext().getRequestDispatcher("/link.jsp").forward(request, response);
       }

削除コードは正常に機能します。他のファイルを削除するとダウンロードします。ユーザーがファイルをダウンロードするときに、ダウンロード後にそのファイルを削除することもできますが、ダウンロードコードが機能していません..削除に失敗したelseコードを出力します

そのファイルを削除する方法を教えてください..または、ダウンロードが完了したらすぐにファイルを削除する方法を教えてください。

4

2 に答える 2

2

読み取り用にファイルを開き、閉じるのを忘れました。開いているファイルをロックするWindowsを使用しているため、削除することはできません。filein.close()クライアントにファイルを送信した後、finallyブロックを呼び出します。次に、それを削除してみてください。これがうまくいくことを願っています。

Linuxではそれは起こり得ません!:)

于 2013-01-16T08:56:05.413 に答える
2

@AlexRが言ったように、Windowsで削除する前にファイルを閉じる必要があります。

try{
    filein = new BufferedInputStream(new FileInputStream(file));
    //do your work
}finally{
    if(filein!=null){
        filein.close(); //close the file
    }
}

ファイル入力ストリームを閉じて、Unix ライク OS でファイル ハンドラを解放します。

于 2013-01-16T09:01:59.007 に答える