关于springMvc-MultipartFile的一个问题

@Service
public class upService {

    public void save(MultipartFile multipartFile) throws IOException {

        multipartFile.getInputStream();

    }

@SuppressWarnings("serial")

private static class StandardMultipartFile implements MultipartFile, Serializable {

    private final Part part;

    private final String filename;

    public StandardMultipartFile(Part part, String filename) {
        this.part = part;
        this.filename = filename;
    }

......这里省略实现类里的其他方法

    @Override
    public InputStream getInputStream() throws IOException {
        return this.part.getInputStream();
    }

我在upService里调用了MultipartFile 这个接口的getInputStream()方法,这里也没有指定实现类,打断点时就直接进到了StandardMultipartFile 这个静态实现类里的方法了,不知道这是如何做到的呢?

貌似是依赖注入实现的?但是没有看出来啊?查了查资料,貌似不是三种依赖注入的写法,MultipartFile的实现类有三个,怎么就调用这个了呢?很迷惑,每次看java的源码都是一堆问号

阅读 2k
1 个回答

你应该看这个接口:MultipartResolver,处理文件上传的策略接口
Spring中,有两个实现:

  • CommonsMultipartResolver
  • StandardServletMultipartResolver

看你标签标注了springboot,那就看MultipartAutoConfiguration

@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
    return multipartResolver;
}

这里默认使用的就是StandardServletMultipartResolver

public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
        return new StandardMultipartHttpServletRequest(request, this.resolveLazily);
    }

这里直接使用StandardMultipartHttpServletRequest包装了原有的request,继续:

private void parseRequest(HttpServletRequest request) {
        try {
            Collection<Part> parts = request.getParts();
            this.multipartParameterNames = new LinkedHashSet<>(parts.size());
            MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap<>(parts.size());
            for (Part part : parts) {
                String headerValue = part.getHeader(HttpHeaders.CONTENT_DISPOSITION);
                ContentDisposition disposition = ContentDisposition.parse(headerValue);
                String filename = disposition.getFilename();
                if (filename != null) {
                    if (filename.startsWith("=?") && filename.endsWith("?=")) {
                        filename = MimeDelegate.decode(filename);
                    }
                    files.add(part.getName(), new StandardMultipartFile(part, filename));
                }
                else {
                    this.multipartParameterNames.add(part.getName());
                }
            }
            setMultipartFiles(files);
        }
        catch (Throwable ex) {
            handleParseFailure(ex);
        }
    }

这里就出现了StandardMultipartFile

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题