ストリーミング、ダウンロードする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を使用してダウンロードファイルを優れた