Java &引用&引用;:非法@MultipartConfig位置

Java &引用&引用;:非法@MultipartConfig位置,java,tomcat,servlets,file-upload,Java,Tomcat,Servlets,File Upload,我希望我的servlet接收应用程序目录树下某个文件夹中的文件。服务器接受多部分/表单数据格式的文件。我知道@MultipartConfig是标记servlet代码的正确属性,以允许服务器创建文件。然而,并非每个位置都被认为是安全的,因此有两个问题: 在指定文件上载servlet的位置时,有哪些限制 路径可以是相对于应用程序路径的,还是应该是绝对的 文件必须在以后下载,所以一般来说,服务器上保存文件的最佳位置是什么(在应用程序树下、树外、Tomcat树外等等?) 因为注释似乎是一种非常“静态”的

我希望我的servlet接收应用程序目录树下某个文件夹中的文件。服务器接受多部分/表单数据格式的文件。我知道
@MultipartConfig
是标记servlet代码的正确属性,以允许服务器创建文件。然而,并非每个位置都被认为是安全的,因此有两个问题:

  • 在指定文件上载servlet的位置时,有哪些限制
  • 路径可以是相对于应用程序路径的,还是应该是绝对的
  • 文件必须在以后下载,所以一般来说,服务器上保存文件的最佳位置是什么(在应用程序树下、树外、Tomcat树外等等?)
  • 因为注释似乎是一种非常“静态”的方式来允许servlet下载东西,所以可以在web.xml中指定同样的方式吗
  • 谢谢

    1:在指定文件上载servlet的位置时,有哪些限制

    它需要可读和可写。它还需要是一个现有的位置,servletcontainer不会在不存在的情况下为您预先创建它


    2:路径可以是相对于应用程序路径的,还是应该是绝对的

    只要1)得到确认,两者都是允许的。容器将在封面下使用
    java.io.File
    来表示位置。所以使用相对路径绝对是个坏主意


    3:文件必须在下载之后才能下载,所以一般来说,服务器上保存文件的最佳位置是(在应用程序树下、树外、Tomcat树外等?)

    在重新部署webapp时,放入webapp文件夹将导致它们全部丢失。由于提取WAR文件是可选的配置设置,因此它在某些服务器配置上也不起作用。因此,最好将它们放在webapp文件夹之外的固定路径上。要再次下载它们,只需向Tomcat添加一个新的
    ,或者创建一个servlet,从中获取一个
    FileInputStream
    ,并写入响应的
    OutputStream
    。示例可在中找到


    4:因为注释似乎是一种非常“静态”的方式来允许servlet下载东西,所以可以在web.xml中指定同样的方式吗

    是的,您可以完全忽略注释的
    location
    属性,并使用
    Part\getInputStream()
    将其写入所需位置。然后可以将servlet的位置指定为
    ,并在
    init()方法中初始化它

    1:在指定文件上载servlet的位置时,有哪些限制

    它需要可读和可写。它还需要是一个现有的位置,servletcontainer不会在不存在的情况下为您预先创建它


    2:路径可以是相对于应用程序路径的,还是应该是绝对的

    只要1)得到确认,两者都是允许的。容器将在封面下使用
    java.io.File
    来表示位置。所以使用相对路径绝对是个坏主意


    3:文件必须在下载之后才能下载,所以一般来说,服务器上保存文件的最佳位置是(在应用程序树下、树外、Tomcat树外等?)

    在重新部署webapp时,放入webapp文件夹将导致它们全部丢失。由于提取WAR文件是可选的配置设置,因此它在某些服务器配置上也不起作用。因此,最好将它们放在webapp文件夹之外的固定路径上。要再次下载它们,只需向Tomcat添加一个新的
    ,或者创建一个servlet,从中获取一个
    FileInputStream
    ,并写入响应的
    OutputStream
    。示例可在中找到


    4:因为注释似乎是一种非常“静态”的方式来允许servlet下载东西,所以可以在web.xml中指定同样的方式吗


    是的,您可以完全忽略注释的
    location
    属性,并使用
    Part\getInputStream()
    将其写入所需位置。然后,您可以将servlet的位置指定为
    ,并在
    init()
    方法中对其进行初始化。

    非常感谢您提供了详尽的答案!请允许我提一个简短的问题:目前,upload dir在my web.xml中指定了两次:一次作为上传servlet的参数,第二次作为multipart config下的位置。我知道第二个是必须的。放弃servlet config参数并从部署描述符读取多部分配置/位置是否明智?如果是-哪种方式最好?如果没有-欢迎提出任何建议。抱歉给你额外的钱,谢谢你!
    @MultipartConfig
    不需要
    位置。它将只存储在服务器的临时文件夹中。您可以使用
    Part#getInputStream()
    从中获取输入流,这样您就可以将其写入
    OutputStream
    所引用的任何位置。非常感谢您提供了详尽的答案!请允许我提一个简短的问题:目前,upload dir在my web.xml中指定了两次:一次作为上传servlet的参数,第二次作为multipart config下的位置。我知道第二个是必须的。放弃servlet config参数并从部署描述符读取多部分配置/位置是否明智?如果是-哪种方式最好?如果没有-欢迎提出任何建议。抱歉给你额外的钱,谢谢你!
    @MultipartConfig
    不需要
    位置。它将只存储在服务器的临时文件夹中。您可以使用
    Part#getInputStream()
    从中获取输入流,以便将其写入
    OutputStream
    所引用的任何位置。