2

我想使用 jsp 将文件上传到 mysql 数据库中。当我使用 input type="file" 时,jsp 没有返回完整路径。我需要完整路径才能在 mysql db 中上传文件。

<form id="translationFormID" method="post" action="saveTranslation">

<input type="file" name="attachCV" id="attachCVID" value="Attach CV">

<input type="submit" name="submit" />

</form>

这是我的jsp页面。我使用 post 方法调用 servlet 'saveTranslation'。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String attachCV=null;
    try{
        String attachCV=request.getParameter("attachCV");
        System.out.println("path= "+attachCV);
    }
    catch(Exception){
        e.printStackTrace();
    }
}

这是我的 servlet 代码。这里获取并打印 attachCV 参数。当我打印 attachCV 时,它显示的内容类似于“c:\fakepath\sample.docx”

4

3 回答 3

4

我需要完整路径才能在 mysql db 中上传文件。

这里有一个重大的思维错误。

想象一下,是想要上传文件的客户端,而是需要获取文件内容的服务器。我c:\path\to\sample.docx完全按照您的要求将我的完整本地磁盘文件系统路径作为唯一信息提供给您。作为服务器,您将如何获得其内容?您是否与我的本地硬盘文件系统建立了开放的 TCP/IP 连接?真的吗?

这不是上传文件的工作方式。这只有在服务器与客户端在物理上运行在同一台机器上时才有效,这样您就可以使用FileInputStream该路径。因此,这只能在本地开发环境中工作,但绝对不能在实际生产环境中运行,因为服务器运行在与客户端不同的物理机器上,由 HTTP 连接分隔。

相反,您应该对客户端与 HTTP 请求正文一起发送给您的唯一文件内容感兴趣。在 HTML 术语中,您可以<input type="file"><form enctype="multipart/form-data">. 可以在此处找到包含完整代码示例的更详细答案:如何使用 JSP/Servlet 将文件上传到服务器?它描述了现代 Servlet 3.0 使用方式request.getPart()和以前事实上的标准 Apache Commons FileUpload API。

一旦你以正确的方式实现它,你最终应该得到一个InputStream代表你从 Servlet 3.0part.getInputStream()或 Apache Commons FileUpload获得的文件内容item.getInputStream()。然后,您可以使用PreparedStatement#setBinaryStream()通常的方式将其存储在数据库中并ResultSet#getBinaryStream()从数据库中检索它。

于 2012-09-22T11:39:12.583 回答
0

当然,您需要在enctype = "multipart/form-data"表单标签中添加一个属性。以下代码解决了您的问题。

<form id="translationFormID" method="post" enctype="multipart/form-data"  
 action="saveTranslation">
    <input type="file" name="attachCV" id="attachCVID" value="Attach CV">
    <input type="submit" name="submit" />
</form>
于 2012-09-22T11:31:46.720 回答
0

您应该使用 Multipart 数据处理程序MultipartRequest来读取 servlet 中的文件内容。客户端返回的路径将始终是客户端的本地路径,除了多部分方式之外,您没有其他方式来读取文件。您可以在 SO 本身中搜索以找到多部分请求处理程序的其他替代方案。

于 2012-09-22T11:36:45.100 回答