私はウェブアプリ(携帯電話用)を開発しています。画像を表示したい xhtml ページが 1 つあります。このページはハード ドライブにローカルに保存されています (例: D:\pictures\test.jpg)。画像がローカルのハードドライブにある場合、ブラウザーは画像をブロックするため、ユーザーが xhtml ページに入ると、localHD に保存されている画像が webApp ディレクトリにコピーされるメソッドを javabean に記述しました。ユーザーがページを離れた後、webapp 内のコピーされたファイルを削除する必要があります。そのため、アプリを実行しているとき、コピーは完全に機能し、写真は正しく表示されます。ただし、ファイルを削除する必要がある場合、次のエラー メッセージが表示されます。
java.nio.file.FileSystemException: D:\WebAppPath\src\main\webapp\resources\pics\test.jpg: ファイルが別のプロセスによって使用されているため、プロセスにアクセスできません。
奇妙なことに、アプリケーションを停止して再起動した後、同じイメージがまだ webApp ディレクトリにある場合は削除できます。(ただし、一度だけ。再コピーした後、エラーメッセージが再び表示されます。)
また、Windows エクスプローラーを使用して手動でファイルを削除しようとすると、Java(TM) Platform SE Binary で使用されているため、ファイルを削除できないというエラー メッセージが表示されます。
したがって、ファイルを (手動または Bean 経由で) 削除するには、アプリケーションの再起動を待つ必要がありますが、これはもちろんエンド ユーザーにとって受け入れられる解決策ではありません。
Primefaces および Primefaces Mobile コンポーネントで JSF2.0 を使用しています。私の IDE は Netbeans で、Spring Webflow フレームワークを使用して、xhtml ページ間でアクション/メソッドをナビゲートおよびトリガーします。
JavaBean のコピー メソッドのコードは次のとおりです。
public void copyFotoToLocalhost() {
if (fotoList.size() > 0) {
for (int i = 0; i < fotoList.size(); i++) {
Foto tempPic = fotoList.get(i);
String tempItemName = tempPic.getItemName();
String originalFile = "D:\\localFilepath\\" + tempItemName;
String tempFileName = "D:\\WebAppPath\\src\\main\\webapp\\resources\\pics\\" + tempItemName;
File existTest = new File(tempFileName);
if (existTest.exists() == false) {
try {
File orFile = new File(originalFile);
File tempFile = new File(tempFileName);
InputStream in = new FileInputStream(orFile);
OutputStream out = new FileOutputStream(tempFile);
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
tempFile.setWritable(true);
System.out.println("File copied.");
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage() + " in the specified directory.");
System.exit(0);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
delete メソッドのコードは次のとおりです。
public void deleteFotos() {
if (fotoList.size() > 0) {
for (int i = 0; i < fotoList.size(); i++) {
Foto tempPic = fotoList.get(i);
String tempItemName = tempPic.getItemName();
Path tempLocation = Paths.get("D:\\webAppPath\\src\\main\\webapp\\resources\\pics\\" + tempItemName);
fotoList.remove(i);
i--;
try {
Files.deleteIfExists(tempLocation);
System.out.println("sucessfully deleted" + tempPic.getItemName());
} catch (IOException ex) {
Logger.getLogger(WundDokuBean.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Fail @ " + tempPic.getItemName());
}
}
fotoList.clear();
}
これを修正する方法はありますか?
私の問題を理解していただければ幸いです。そうでない場合は、必要な情報を教えてください。提供できるように努めます。