SpringBoot ioストリームは、リソースの下に保存されているExcelをエクスポートします

ストリーミング、ダウンロードするExcel。ローカルでは、サーバーは次のことを報告します。

問題1:FileNotFoundException(ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。)

java.io.FileNotFoundException:file:\ E:\ liziyi \ guopei6 \ gp6-exam \ target \ gp6-exam-0.0.1-SNAPSHOT.jar!\ BOOT-INF \ classes!\ exceltemplate \ excam_record_import_template.xls(ファイル名、ディレクトリ名またはボリュームラベルの構文が正しくありません。)

サーバーはjarパッケージを作成して実行する必要があるため、ソースコードは上記のエラーを報告します。getResourceAsStream()を使用してファイルアドレスを照会すると、エラーが報告されます。

 public String download(String fileName, String folder, HttpServletRequest request, HttpServletResponse response) {
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
        try {
            String path = this.getClass().getClassLoader().getResource(folder + "/" + fileName).getPath();
            InputStream inputStream = new FileInputStream(new File(path));
            OutputStream os = response.getOutputStream();
            byte[] b = new byte[2048];
            int length;
            while ((length = inputStream.read(b)) > 0) {
                os.write(b, 0, length);
            }
            // 这里主要关闭。
            os.close();

            inputStream.close();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

解決:

jarは圧縮パッケージであるため、getResourceの代わりにgetResourceAsStreamを使用する必要があります

public String download(String fileName, String folder, HttpServletRequest request, HttpServletResponse response) {
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
        try {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(folder + "/" + fileName);
            OutputStream os = response.getOutputStream();
            byte[] b = new byte[2048];
            int length;
            while ((length = inputStream.read(b)) > 0) {
                os.write(b, 0, length);
            }
            // 这里主要关闭。
            os.close();

            inputStream.close();
        } catch (FileNotFoundException e) {
            log.error(e.getMessage(), e);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

问题二:getOutputStream()はすでにこの応答のために呼び出されています

翻訳:getOutputStream()がこの応答に対して呼び出されたか、またはresponse.getOutputStream()が使用されており、再度使用することはできません。

しかし、実行すると、nullポインターが原因であることがわかります。これは、次の図でチェックされている2つのメソッドとは関係ありません。 

次に、this.getClass()。getClassLoader()。getResourceAsStreamを解決します(nullを取得する理由

質問3:this.getClass()。getClassLoader()。getResourceAsStream()はNullの値を取得します

最初に考慮すべきことは、フェッチされたファイルがnullである理由です。

1.メソッドによりエラーが発生します

まず、方法が間違っているのではないかと思います。結局のところ、ストリームを使用してファイルをエクスポートする方法はn個あります。オンラインクエリの定義は次のとおりです。

1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 

2.Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。 

分かりません、大丈夫です

2.場所がエラーの原因

ローカルのExcelファイルがExamモジュールに配置され、Excelのダウンロード方法がモデルモジュールに配置され、Lms、Order、およびExamモジュールがモデルモジュールを呼び出してから、examモジュールに移動してファイルをダウンロードします。

これで、試験モジュールテストはファイルを取得できますが、他のモジュールは取得できません。ファイルに他のモジュールがないため、エラーが報告されます。

後で、Excelを試験モジュールから各モジュールに移動して、クラスがこのモジュールからExcelファイルを取得できるようにします。本当に問題を解決しました。以下に示すように:

追加予定:

Excel、最初に生成してからダウンロード

マルチスレッドとredisを使用してダウンロードファイルを優れた

おすすめ

転載: blog.csdn.net/Ciel_Y/article/details/123376492