删除java服务器上的映像

删除java服务器上的映像,java,Java,我正在做一个由java服务器和网页组成的项目。我想这样做,当你从网上删除一个对象时,服务器会删除与这个对象相关的图像。每个对象的图像都存储在web文件夹的images文件夹中。但是,当我尝试删除服务器中的图像时,它表示该文件被另一个进程使用,因为web服务器的线程正在使用它(我使用grizzly),所以我无法删除它 //save the image private void saveImage(Eetakemon e){ String base64Image = e.getImage()

我正在做一个由java服务器和网页组成的项目。我想这样做,当你从网上删除一个对象时,服务器会删除与这个对象相关的图像。每个对象的图像都存储在web文件夹的images文件夹中。但是,当我尝试删除服务器中的图像时,它表示该文件被另一个进程使用,因为web服务器的线程正在使用它(我使用grizzly),所以我无法删除它

//save the image
private void saveImage(Eetakemon e){
    String base64Image = e.getImage().split(",")[1];
    byte[] imageBytes = 
javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);
    File imageFile = new File("WEB\\images\\" + e.getName() + ".png");
    try {
        BufferedImage bufferedImage = ImageIO.read(new 
ByteArrayInputStream(imageBytes));
        ImageIO.write(bufferedImage, "png", imageFile);
    }
    catch(Exception ex){
        ex.printStackTrace();
    }

}

//delete the image
private void deleteImage(Eetakemon e){
    try {
        Files.deleteIfExists(Paths.get("WEB\\images\\" + e.getName() + 
".png"));
    }catch(Exception ex){
        ex.printStackTrace();
    }
}
这些函数分别在create和delete方法中调用


谢谢

您遇到了锁定所用文件的windows属性。您需要找到正在使用该文件的进程并关闭该资源。这是您唯一可行的选择,除非您能够在不锁定正在使用的文件的系统上运行。Linux/Unix系统没有这种行为,即使使用了该文件,它们也允许您删除该文件。

您应该在文件系统中使用具有读/写访问权限的单独文件夹,并让web服务器只负责提供静态内容,如静态图像、HTML、CSS和JS文件

要处理最终可以在运行时删除的动态图像文件,请将业务逻辑保留在单独的服务中,例如RESTAPI或简单的Servlet

您可以将已删除的图像临时移动到单独的文件夹中,以便稍后计划的批处理作业将其标记为删除

删除图像的服务示例:

public void removeFiles(List<String> fileNames) {
    try {
        String trashFolderLocation = ConfigurationManager.getInstance().getConfig().getImgFileTrashPath();
        String uploadedFileLocation = ConfigurationManager.getInstance().getConfig().getFilePath();

        FileUtil.moveFilesToFolder(uploadedFileLocation, trashFolderLocation, fileNames);       

    } catch(FileException e) {
        logException(e);
    }       
}
public void removeFiles(列出文件名){
试一试{
字符串trashFolderLocation=ConfigurationManager.getInstance().getConfig().getImgFileTrashPath();
String uploadedFileLocation=ConfigurationManager.getInstance().getConfig().getFilePath();
moveFilesToFolder(上传的文件位置、垃圾文件夹位置、文件名);
}捕获(文件异常e){
例外情况(e);
}       
}
在FileUtil中:

public static boolean moveFilesToFolder(String locationFrom, String locationTo, List<String> fileNames) throws FileException {
    try {
        for (String fileName : fileNames) {
            File afile = new File(locationFrom + fileName);
            if (!afile.renameTo(new File(locationTo + fileName))) {
                return false;
            }
        }

    } catch (Exception e) {
        throw new FileException(e);
    }   
    return true;
}
public静态布尔moveFilesToFolder(字符串locationFrom、字符串locationTo、列表文件名)引发FileException{
试一试{
for(字符串文件名:文件名){
File afile=新文件(locationFrom+文件名);
如果(!afile.renameTo(新文件(locationTo+fileName))){
返回false;
}
}
}捕获(例外e){
抛出新的FileException(e);
}   
返回true;
}

我们需要更多的细节。我猜服务器是在Windows上运行的,Windows不允许删除正在使用的文件:您可能忘记关闭读写器。。。但很难提供比模糊暗示更多的信息。你能分享你处理文件的代码吗?(不仅仅是你删除它的地方)是的,我正在使用windows。问题似乎是web服务器的线程锁定了图像,我无法删除它们,但我不知道是否还有其他选择。在您共享的两种方法(一种写入,一种删除)中,我没有看到任何可以保持文件打开的方法(
ImageIO.write
完成后应关闭文件),所以问题可能不在这里。难道你没有另一段代码可以读取文件吗?--你还写了“它说这个文件被另一个进程使用”:你能分享准确的错误消息吗,如果有堆栈跟踪吗?这里有很好的建议,但是为了更好的例子,你可以使用Java 7之类的新API,它提供了更好的选项和更好的错误处理。当然最好将你的建议用于文件NIO类