您好我正在构建一个管理员可以上传新产品的Web应用程序(在线商店)。 其中一个输入类型是文件(产品图片) 我希望将产品的图像存储在一个文件夹中,每个产品都会在数据库表中关联一个图像。
我的问题是,输入类型=文件是如何工作的?我仍然不明白当我提交表单时,servlet会将图像粘贴到网页文件夹中,以及如何获取的值(图像名称)存储在数据库表中?
对于其他输入,我使用“value”来获取信息。
谢谢!
答案 0 :(得分:2)
在java中,很难处理文件上传。但是有许多库可以做到这一点。最受欢迎的是apache commons file uploads这是一个关于如何在java中执行此操作的示例:
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
您应该使用更多选项。
答案 1 :(得分:1)
输入类型=文件如何工作?
这将用于<form>
multipart/form-data
编码。选择文件并提交表单后,文件内容将成为HTTP请求正文的一部分。在servlet中,它由request.getInputStream()
作为“原始”数据提供。在仅支持servlet 2.5或更早版本的servletcontainers中,没有API提供的工具来解析数据。 Apache Commons FileUpload是事实上的标准。从servlet 3.0开始,您可以使用API提供的request.getParts()
来使用Commons FileUpload的许可副本。
我仍然不明白当我提交表单时,servlet会将图像粘贴到网页文件夹中,以及如何获取要存储在数据库表中的值(图像名称) ?
您不仅应该对文件名感兴趣。您还应该对文件内容感兴趣。无论您选择何种方式将上传的文件解析出请求正文,您最终都应该使用InputStream
或byte[]
的文件内容。您可以使用FileOutputStream
将其写入本地磁盘文件系统,并以通常的JDBC方式将唯一文件名存储在DB中。
答案 2 :(得分:0)
将文件上传到Web服务器时,通常包含以下信息(或类似信息):
Content-Disposition: form-data; name="fileInput"; filename="myFile.txt"
Content-Type: application/octet-stream
filename
包含文件名或完整路径,具体取决于浏览器。
如果您使用Fiddler之类的程序,则可以准确了解上传文件时发生的情况。