这是特定于 API 的代码。即不是通常的文件上传代码。
通常的步骤是:
- 构造 FileItemFactory
- 构造 ServletFileUpload,将其传递给工厂
- 调用 ServletFileUpload.parseRequest(request)
此答案用独立于 servlet 的逻辑替换 2 和 3 - 它避免使用 ServletFileUpload(特定于 servlet)及其祖先 FileUpload(以便使用绝对路径名控制文件位置)。注意:(3) 通常检查 HTTP 请求参数以确定传递给 FileItemFactory.createItem 的较低级别参数 - 这些参数是手动提供的,然后仅用作信息元数据。替换 2 和 3:
- 构造 FileItem(通过 FileItemFactory.createItem - 需要手动提供低级参数,通常通过 ServletFileUpload.upload() 确定)
- 使用绝对路径写入特定文件
- 通过 MultipartFile 上传文件
下面提供了请求的代码。最后,它调用公共代码 - 与 Servlet 上传共享。
// Initialise Apache Commons FileItemFactory for API use only
FileItemFactory fif = new DiskFileItemFactory(sizeThreshold, repositoryBaseDirFile);
// Create Apache Commons FileItem & write file at fullFilePathString into it
FileItem fi = fif.createItem(fieldName, contentType, isFormField, fileName);
fi.write(new java.io.File(new java.net.URI(fullFilePathString));
// Convert FileItem to Spring wrapper: CommonsMultipartFile
org.springframework.web.multipart.MultipartFile mf = new CommonsMultipartFile(fi);
// From here, reuse the same code as the servlet upload. Operate only upon
// Spring MultipartFile, but not ServletFileUpload, FileItemFactory etc...
参数:
- fullFilePathString : 上传文件的绝对路径(字符串形式)
- fieldName : 表单上的字段名称
(由于避免了ServletFileUpload & FileUpload,以下仅成为元数据字段,不用于控制处理)
- sizeThreshhold:以字节为单位的内存大小阈值(通常较小的文件仅使用内存上传,较大的文件通过磁盘上传 - 但此逻辑始终通过磁盘上传文件)。默认值 = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD。
- repositoryBaseDireFile:通常是文件上传'temp'目录(作为文件类型),但是这个逻辑使用绝对路径来上传文件
- contentType : 表单上字段的内容类型(MIME 类型)(如果不是多部分表单字段,则为 null)
- isFormField:如果是普通表单字段,则为“true”,如果是多部分字段,则为 false。
- fileName : 文件名 - 通常通过表单/客户端指定。