for (FileItem fileItem:list){ if (fileItem.isFormField()){ //普通表单项 System.out.println("表单项name的属性值"+fileItem.getFieldName()); //参数UTF-8解决乱码问题 System.out.println("表单项value的属性值"+fileItem.getString("UTF-8")); }else{ //上传文件 System.out.println("表单项的name属性值"+fileItem.getFieldName()); System.out.println("上传的文件名:"+fileItem.getName()); fileItem.write(new File("C:\\Users\\86184\\Pictures\\"+fileItem.getName())); } }
时间: 2024-02-10 08:12:42 浏览: 67
这是一个文件上传的代码片段。首先,代码使用了Apache文件上传组件(Commons FileUpload)解析HTTP请求中的表单数据。其中,`list`是`FileItem`对象的列表,每个`FileItem`对象表示表单中的一个表单项(可以是普通表单项或上传的文件)。接着,代码通过判断`FileItem`对象的`isFormField()`方法是否返回`true`,来区分普通表单项和上传的文件。如果是普通表单项,则打印出该表单项的`name`属性值和`value`属性值;如果是上传的文件,则打印出该表单项的`name`属性值和上传的文件名,并将该文件保存到本地磁盘上的`C:\Users\86184\Pictures\`目录下。
相关问题
java web 基于参数工具类完成普通文本、图片的参数接收,上传效果截图(图片可以正常显示),及代码结构(能看到out目录下的upload中存在上传的文件)
在Java Web中,你可以使用MultipartResolver或者第三方库如Apache Commons FileUpload来处理表单数据,包括普通文本和图片的上传。这里是一个基本的代码结构示例,使用了`HttpServletRequest`对象来获取请求参数:
```java
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadUtil {
// 检查是否为multipart请求
public boolean isMultipart(HttpServletRequest request) {
return ServletFileUpload.isMultipartContent(request);
}
// 实现文件上传
public void handleFileUpload(HttpServletRequest request, HttpServletResponse response) throws Exception {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) { // 处理非文件字段
String fieldname = item.getFieldName();
String fieldValue = item.getString();
System.out.println("Field [" + fieldname + "]: " + fieldValue);
} else { // 处理文件上传
String fileName = item.getName(); // 文件名
String savePath = "/out/upload/" + fileName; // 保存路径
item.write(new File(savePath)); // 写入到服务器指定目录
// 图片显示:假设你已经设置了响应头支持inline图片展示
byte[] imageBytes = item.get();
response.setContentType(item.getContentType());
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.getOutputStream().write(imageBytes);
}
}
} finally {
upload.cleanup();
}
}
}
```
在这个例子中,如果用户提交了一个包含文本和图片的表单,`handleFileUpload`方法会分别处理它们,并将图片保存在服务器的`/out/upload/`目录下。图片文件通常会在该目录下显示,但为了安全起见,你还需要对上传文件做验证(比如检查大小、类型等)。
在ABCServlet的doPost()方法的if语句后,添加如下代码,即可实现多文件上传
在 `ABCServlet` 的 `doPost()` 方法的 `if` 语句之后添加多文件上传功能,通常需要借助 `HttpServletRequest` 对象来处理。这里是一个基本示例,假设你已经有一个 `parts` 数组来存储请求分片:
```java
String[] parts = request.getParameterValues("file"); // 获取多选文件的部分值
if (parts != null) {
List<FileItem> uploadedFiles = new ArrayList<>();
try {
for (String part : parts) {
FileItem fileItem = new DiskFileItemFactory().createItem(request, part);
if (!fileItem.isFormField()) { // 检查是否是普通文件而非表单字段
uploadedFiles.add(fileItem);
}
}
// 验证所有文件是否上传成功
for (FileItem fileItem : uploadedFiles) {
if (!fileItem.isInMemory() && !fileItem.moveTo(tempDir)) { // 将文件移动到临时目录
System.out.println("Error saving file to temp directory");
return;
}
}
// 然后你可以对每个文件进行进一步操作,如保存、处理等
for (FileItem uploadedFile : uploadedFiles) {
if (uploadedFile.isFormField()) continue; // 跳过非文件字段
String fileName = Paths.get(uploadedFile.getName()).getFileName().toString();
// 保存文件到服务器的某个位置,例如数据库路径
saveUploadedFileToServer(fileName, uploadedFile.getInputStream());
}
// 清理资源
for (FileItem item : uploadedFiles) {
item.delete();
}
// 返回响应,告知文件已上传
response.getWriter().println("Files uploaded successfully");
} catch (Exception e) {
// 处理上传错误
e.printStackTrace();
response.getWriter().print("Upload failed: " + e.getMessage());
}
}
```
在这个例子中,`DiskFileItemFactory` 和 `FileItem` 是用于解析MultipartRequest的一部分,你需要在项目中导入相关的库,并确保它们正确配置。
阅读全文