关于springMvc-MultipartFile的一个问题

发布于 2022-09-12 23:31:43 字数 926 浏览 30 评论 0

@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的源码都是一堆问号

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

抱着落日 2022-09-19 23:31:43

你应该看这个接口: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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文