request.getAttribute这里获取不到文件转成MultipartFile类型
时间: 2024-01-31 09:57:19 浏览: 75
`request.getAttribute()` 方法是用于获得请求中的 attribute 属性值,而不是用于获取文件上传的内容。如果你想要获取上传的文件,应该使用 multipart/form-data 类型的请求,并使用 `request.getPart()` 或 `request.getParts()` 方法获取上传的文件内容。
如果你使用 Spring 框架,可以在控制器方法中使用 `@RequestParam("file") MultipartFile file` 注解来获取上传的文件。然后你就可以通过该 MultipartFile 对象来操作上传的文件了。
相关问题
public Map<String,String> upload(Manuscript manuscript,MultipartFile manuscript_file,HttpServletRequest request, HttpServletResponse response ) throws IOException{ Map<String,String> ret = new HashMap<String,String>(); if(StringUtils.isEmpty(manuscript.getAuthor_name())) { ret.put("type","error"); ret.put("msg","作者姓名不能为空!"); return ret; } String author_name = request.getSession().getAttribute("author_name").toString(); if(!manuscript.getAuthor_name().equals(author_name)) { ret.put("type","error"); ret.put("msg","请输入正确的姓名!"); return ret; } if(StringUtils.isEmpty(manuscript.getTitle())) { ret.put("type","error"); ret.put("msg","稿件标题不能为空!"); return ret; } if(StringUtils.isEmpty(manuscript.getSummary())) { ret.put("type","error"); ret.put("msg","稿件摘要不能为空!"); return ret; } if(manuscript_file==null) { ret.put("type","error"); ret.put("msg","文件没有选择"); return ret; } if(manuscript_file.getSize() > 10485760){ //文件没有选择 ret.put("type", "error"); ret.put("msg", "文件大小超过10M!"); return ret; } String suffix = manuscript_file.getOriginalFilename().substring(manuscript_file.getOriginalFilename().lastIndexOf(".")+1,manuscript_file.getOriginalFilename().length()); if(!"docx,doc,pdf".contains(suffix)) { ret.put("type","error"); ret.put("msg","文件格式不正确!"); return ret; } String savePath = request.getServletContext().getRealPath("/")+"\upload\"; File savePathFile = new File(savePath); if(!savePathFile.exists()) { savePathFile.mkdir(); } String fileName = new Date().getTime()+"."+suffix; ret.put("src",request.getServletContext().getContextPath() + "/upload/" + fileName); manuscript_file.transferTo(new File(savePath+fileName)); manuscript.setFilePath(ret.get("src")); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String format = sf.format(new Date()); manuscript.setSubmit_time(format); manuscript.setId((Integer)request.getSession().getAttribute("id")); manuscript.setState("待审核"); if(authorService.add(manuscript)<=0) { ret.put("type","error"); ret.put("msg","稿件添加失败!"); return ret; } ret.put("type", "success"); ret.put("msg", "文件上传成功!"); return ret; }这段代码什么意思
这是一个Java语言编写的上传文件的函数,函数需要传入一个Manuscript对象、一个MultipartFile对象、一个HttpServletRequest对象和一个HttpServletResponse对象。函数使用了HashMap来返回处理结果,同时进行了参数校验和文件存储操作。如果参数不符合要求,函数会返回错误提示。如果文件大于10M、不是docx、doc或pdf格式,函数也会返回错误提示。最后,将稿件添加到数据库中,并返回成功提示。
springboot拦截器统一限制文件类型和大小
在 Spring Boot 中,你可以通过使用拦截器来统一限制上传文件的类型和大小。拦截器可以拦截所有的上传请求,然后在上传之前进行校验。
首先,你需要创建一个拦截器类,并实现 HandlerInterceptor 接口。在拦截器中,你可以重写 preHandle 方法来实现文件上传的校验。以下是一个简单的例子:
```
public class FileUploadInterceptor implements HandlerInterceptor {
private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
private static final List<String> ALLOWED_CONTENT_TYPES = Arrays.asList("image/jpeg", "image/png");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 检查方法是否有 @PostMapping 注解
PostMapping postMapping = handlerMethod.getMethodAnnotation(PostMapping.class);
if (postMapping == null) {
return true;
}
// 检查方法参数是否有 MultipartFile 类型
MethodParameter[] methodParameters = handlerMethod.getMethodParameters();
for (MethodParameter methodParameter : methodParameters) {
if (methodParameter.getParameterType().equals(MultipartFile.class)) {
MultipartFile file = (MultipartFile) request.getAttribute(methodParameter.getParameterName());
// 检查文件大小
if (file.getSize() > MAX_FILE_SIZE) {
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.getWriter().write("File size too large");
return false;
}
// 检查文件类型
String contentType = file.getContentType();
if (!ALLOWED_CONTENT_TYPES.contains(contentType)) {
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.getWriter().write("File type not allowed");
return false;
}
}
}
}
return true;
}
}
```
在上面的代码中,我们首先检查请求处理的方法是否有 @PostMapping 注解,并且是否有 MultipartFile 类型的参数。如果都符合条件,我们就可以从请求中获取到上传的文件,并进行校验。如果上传的文件不符合要求,我们就返回一个错误响应。否则,就放行请求,让请求继续被处理。
接下来,你需要在 Spring Boot 应用程序中注册这个拦截器。你可以创建一个配置类,并实现 WebMvcConfigurer 接口。在这个配置类中,你可以重写 addInterceptors 方法来注册你的拦截器。以下是一个简单的例子:
```
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private FileUploadInterceptor fileUploadInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(fileUploadInterceptor)
.addPathPatterns("/upload");
}
}
```
在上面的代码中,我们首先创建了一个 WebMvcConfigurer 类,并注入了我们之前创建的 FileUploadInterceptor。然后,我们重写了 addInterceptors 方法,并将我们的拦截器注册到了 /upload 路径下。这样,当用户上传文件时,我们的拦截器就会拦截请求,并对上传的文件进行校验。
阅读全文