17

私はウェブアプリケーションを持っています。私はJavaと春を使用しています。アプリケーションはファイルを作成してブラウザに送信できます。これは正常に機能しています。私がそれを行う方法は次のとおりです。

Services クラスでファイルを作成すると、メソッドはコントローラーにアドレスを返します。その後、コントローラーはファイルを送信し、正しくダウンロードされます。コントローラーメソッドのコードはこれです。

@RequestMapping("/getFile")
public @ResponseBody
FileSystemResource getFile() {

    String address = Services.createFile();
    response.setContentType("application/vnd.ms-excel");
    return new FileSystemResource(new File (address));
}

問題は、ファイルがサーバーに保存され、多くの要求の後に多くのファイルが作成されることです。それらを手動で削除する必要があります。問題は、送信後にこのファイルを削除するにはどうすればよいかということです。またはサーバーに保存せずにファイルを送信する方法はありますか?

4

5 に答える 5

29

使用しないでください@ResponseBody。Spring に を注入させHttpServletResponse、その に直接書き込みますOutputStream

@RequestMapping("/getFile")
public void getFile(HttpServletResponse response) {
    String address = Services.createFile();
    File file = new File(address);
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-disposition", "attachment; filename=" + file.getName());

    OutputStream out = response.getOutputStream();
    FileInputStream in = new FileInputStream(file);

    // copy from in to out
    IOUtils.copy(in,out);

    out.close();
    in.close();
    file.delete();
}

例外処理は追加していません。私はそれをあなたに任せます。

FileSystemResourceFileInputStreamこれは、Spring で使用されるラッパーです。

または、ハードコアになりたい場合は、呼び出し時に基になるファイルを削除する独自の実装を返すFileSystemResource独自のメソッドを使用して、独自の実装を作成できます。getOutputStream()FileOutputStreamclose()

于 2013-07-29T20:29:15.033 に答える
10

そこで私は、「ハードコア」な方法について Sotirios の提案を採用することにしました。とてもシンプルですが、問題が 1 つあります。そのクラスのユーザーが何かを確認するために入力ストリームを一度開いて閉じた場合、閉じるとファイルが削除されるため、再度開くことはできません。Spring はそうしていないようですが、バージョンアップのたびに確認する必要があります。

public class DeleteAfterReadeFileSystemResource extends FileSystemResource {
    public DeleteAfterReadeFileSystemResource(File file) {
        super(file);
    }

    @Override
    public InputStream getInputStream() throws IOException {
        return new DeleteOnCloseFileInputStream(super.getFile());
    }

    private static final class DeleteOnCloseFileInputStream extends FileInputStream {

        private File file;
        DeleteOnCloseFileInputStream(File file) throws FileNotFoundException    {
            super(file);
            this.file = file;
        }

        @Override
        public void close() throws IOException {
            super.close();
            file.delete();
        }
    }
}
于 2016-05-19T14:23:12.313 に答える