4

呼び出されるたびに数千の文字列をランダムに生成する Java サーブレットがあります。ユーザーがサーブレットを呼び出したときにファイルでそれらを取得できるようにしたい。最初にディスクまたはメモリにファイルを書き込みたくありません。ユーザーがサーブレットを呼び出したときにその場でファイルを書き込む方法はありますか? ありがとう

4

2 に答える 2

5

サーブレットで生成するテキストは、 によって返される OutputStream に単純に書き込むことができますServletResponse.getOutputStream()

出力をファイルとしてダウンロードできるようにする場合は、この回答のアプローチに従うことができます - https://stackoverflow.com/a/11772700/1372207

違いは、Content-type が であり、別の入力ストリームから読み取る代わりに、メソッドを使用しtext/plainて String オブジェクトを直接 に書き込むことです。ServletOutputStreamprint(String)

于 2012-08-15T22:47:02.440 に答える
0

コンテンツをローカルに保存してから FileInputStream としてファイルを読み取るのではなく、ダウンロード サービスを提供しながら HttpServletResponse の出力ストリームにコンテンツを書き込むというアイデアを使用する場合は、InputStream stream = new ByteArrayInputStream(exampleString.getBytes("UTF-8"));.

次のコードは、https://www.codejava.net/java-ee/servlet/java-servlet-download-file-exampleを部分的に参照しています。

    public void doDownload(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String fileName = "xxx.txt";
        String fileContent = "";

        // get absolute path of the application
        ServletContext context = request.getServletContext();

        // get MIME type of the file
        String mimeType = context.getMimeType(fileName);
        if (mimeType == null) {
            // set to binary type if MIME mapping not found
            mimeType = "application/octet-stream";
        }

        setResponseHeader(response, fileName, mimeType, (int) fileContent.length());

        InputStream inputStream = new ByteArrayInputStream(fileContent.getBytes("UTF-8"));
        // get output stream of the response
        OutputStream outStream = response.getOutputStream();

        byte[] buffer = new byte[4096];
        int bytesRead = -1;

        // write bytes read from the input stream into the output stream
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
        }

        inputStream.close();
        outStream.close();
    }

    private void setResponseHeader(HttpServletResponse response, String fileName, String mimeType, Integer fileLength) {
        response.setContentType(mimeType);
        response.setContentLength(fileLength);
        response.setContentType("application/octet-stream; charset=UTF-8");

        String headerKey = "Content-Disposition";
        String headerValue = String.format("attachment; filename=\"%s\"", fileName);
        response.setHeader(headerKey, headerValue);

        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
    }
于 2020-06-05T15:15:18.670 に答える