Web应用程序:在运行时删除文件

Lms24

我正在开发一个webapp(用于手机)。有一个xhtml页面,我要在其中显示图片,该图片存储在本地硬盘中(例如:D:\ pictures \ test.jpg)。由于浏览器将图像放置在本地硬盘驱动器上时会阻止它们,因此我在javabean中编写了一个方法,当用户进入xhtml页面时,将存储在localHD上的图像复制到webApp目录中。用户离开页面后,应删除webapp内部的复制文件。因此,当我运行我的应用程序时,复制效果很好,并且图片显示正确。但是,当应删除文件时,出现以下错误消息:

java.nio.file.FileSystemException:D:\ WebAppPath \ src \ main \ webapp \ resources \ pics \ test.jpg:无法访问该进程,因为该文件正在被另一个进程使用。

奇怪的是,在停止并重新启动应用程序之后,如果同一图像仍在webApp目录中,则可以将其删除。(但是只有一次;重新复制后,我再次收到错误消息。)

另外,如果我想通过使用Windows资源管理器手动删除文件,则会收到错误消息,指出该文件不能删除,因为该文件已被Java(TM)Platform SE Binary使用。

因此,要删除文件(手动或通过Bean),我必须等待应用程序重新启动,这对于最终用户而言当然不是可接受的解决方案。

我正在将JSF2.0与Primefaces和Primefaces Mobile组件一起使用。我的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();
        }

您有想法,如何解决?

希望您能理解我的问题,如果没有,请告诉我您需要哪些信息,我会尽力提供。

BalusC

有一个xhtml页面,我要在其中显示图片,该图片存储在本地硬盘中(例如:D:\ pictures \ test.jpg)。由于浏览器位于本地硬盘驱动器上时会阻止图像(...)

我想首先清除一个概念上的误解:您似乎希望当浏览器不会阻止它时,它会很好地工作。这是完全不正确的。您似乎希望图像在HTML输出中内联。不可以,它们是从HTML页面单独下载的,也可以独立于HTML页面下载。如果您继续使用本地磁盘文件系统路径,那么只有在您的网页访问者磁盘文件系统上的完全相同的位置上也具有完全相同的文件时,它才会起作用实际上,事实并非如此。仅当Web浏览器和Web服务器都在同一台计算机上运行时,它才起作用。


回到无法删除文件的具体问题,这是因为servlet容器通常将文件锁定在扩展的WAR文件夹中。我不能说出确切的原因,但这与这里无关,因为整个方法还是错误的。当已部署的WAR文件未在磁盘文件系统上扩展,而是在服务器的内存中扩展时,此方法将失败。同样,对环境特定的磁盘文件系统路径进行硬编码也是一个坏主意。每次更改环境时,您都需要编辑,重写,重新编译,重建整个WAR。换句话说,您的Web应用程序不可移植。

您需要将文件保留在原始位置,并通过真实的URL公开提供。这可以通过2种常规方法来实现:

  1. 将虚拟主机添加到服务器配置中,指向D:\localFilepath\如何实现这一点取决于所使用的服务器。您没有提供有关使用的服务器制造/版本的任何信息,但是使用Spring意味着您无法使用完整的Java EE堆栈,并且可能使用了准系统JSP / Servlet容器(例如Tomcat)。在这种情况下,只需在其行中添加以下行即可/conf/server.xml

    <Context docBase="D:\localFilepath" path="/fotos" />
    

    这样,它们可以通过来使用http://localhost:8080/fotos/*


  2. 创建一个Servlet,该Servlet从D:\localFilepathHTTP响应中读取文件并写入HTTP响应。使用Servlet 3.0和Java 7确实很容易。这是一个启动示例(doHead()为简洁起见,省略了nullchecks / file-exist-checks / / caching / resuming):

    @WebServlet("/fotos/*")
    public class FotosServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcpetion, IOException {
            File file = new File("D:/localFilepath", request.getPathInfo().substring(1));
            response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
            response.setHeader("Content-Length", String.valueOf(file.length()));
            Files.copy(file.toPath(), response.getOutputStream());
        }
    
    }
    

    基本上就是这样。这样就可以在上使用它们http://localhost:8080/contextname/fotos/*

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时提升Java应用程序

来自分类Dev

Apache Storm应用程序在运行时失败

来自分类Dev

在运行时更改应用程序MainForm

来自分类Dev

在运行时更改应用程序语言

来自分类Dev

在运行时更改应用程序MainForm

来自分类Dev

在运行时设计 Angular 应用程序的样式

来自分类Dev

使用外部主题文件在运行时更改应用程序主题

来自分类Dev

简单的CefSharp应用程序在运行时丢失文件

来自分类Dev

在应用程序运行时更改属性文件

来自分类Dev

Quarkus:如何在应用程序外部或在运行时定义和读取属性文件(或application.properties)?

来自分类Dev

如何从正在运行的应用程序中找到Groovy运行时版本?

来自分类Dev

Android:调试正在运行的应用程序的正确方法(运行时错误/日志)

来自分类Dev

如果我的应用程序在Android Wear上运行,如何确定(在运行时)?

来自分类Dev

blazor wasm应用程序在运行时的程序集构建版本

来自分类Dev

运行时应用程序

来自分类Dev

在运行时检测应用程序是否处于发布模式

来自分类Dev

在运行时确定应用程序属于控制台/ Windows子系统

来自分类Dev

使用MSVC编译的多线程应用程序在运行时失败

来自分类Dev

在运行时即时更改应用程序语言

来自分类Dev

将应用程序打包在docker中,可以在运行时对其进行配置

来自分类Dev

在运行时阻止WCF消息记录在客户端应用程序中

来自分类Dev

如何在运行时更改android应用程序的名称和图标?

来自分类Dev

在运行时更改Cocoa应用程序图标,标题和菜单标签

来自分类Dev

如何在运行时更改应用程序图标?

来自分类Dev

自动布局黄色警告。它会在运行时使我的应用程序崩溃吗

来自分类Dev

Android / Google Play-应用程序可以在运行时进行更新吗

来自分类Dev

在运行时使用按钮更改应用程序语言

来自分类Dev

更新到Android 3.6工作室后,在运行时应用程序崩溃

来自分类Dev

可以在运行时更改argv(不能由应用程序本身更改)

Related 相关文章

  1. 1

    在运行时提升Java应用程序

  2. 2

    Apache Storm应用程序在运行时失败

  3. 3

    在运行时更改应用程序MainForm

  4. 4

    在运行时更改应用程序语言

  5. 5

    在运行时更改应用程序MainForm

  6. 6

    在运行时设计 Angular 应用程序的样式

  7. 7

    使用外部主题文件在运行时更改应用程序主题

  8. 8

    简单的CefSharp应用程序在运行时丢失文件

  9. 9

    在应用程序运行时更改属性文件

  10. 10

    Quarkus:如何在应用程序外部或在运行时定义和读取属性文件(或application.properties)?

  11. 11

    如何从正在运行的应用程序中找到Groovy运行时版本?

  12. 12

    Android:调试正在运行的应用程序的正确方法(运行时错误/日志)

  13. 13

    如果我的应用程序在Android Wear上运行,如何确定(在运行时)?

  14. 14

    blazor wasm应用程序在运行时的程序集构建版本

  15. 15

    运行时应用程序

  16. 16

    在运行时检测应用程序是否处于发布模式

  17. 17

    在运行时确定应用程序属于控制台/ Windows子系统

  18. 18

    使用MSVC编译的多线程应用程序在运行时失败

  19. 19

    在运行时即时更改应用程序语言

  20. 20

    将应用程序打包在docker中,可以在运行时对其进行配置

  21. 21

    在运行时阻止WCF消息记录在客户端应用程序中

  22. 22

    如何在运行时更改android应用程序的名称和图标?

  23. 23

    在运行时更改Cocoa应用程序图标,标题和菜单标签

  24. 24

    如何在运行时更改应用程序图标?

  25. 25

    自动布局黄色警告。它会在运行时使我的应用程序崩溃吗

  26. 26

    Android / Google Play-应用程序可以在运行时进行更新吗

  27. 27

    在运行时使用按钮更改应用程序语言

  28. 28

    更新到Android 3.6工作室后,在运行时应用程序崩溃

  29. 29

    可以在运行时更改argv(不能由应用程序本身更改)

热门标签

归档