All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mxixm.fastboot.weixin.controller.invoker.common.WxMediaResourceMessageConverter Maven / Gradle / Ivy

The newest version!
package com.mxixm.fastboot.weixin.controller.invoker.common;

import com.mxixm.fastboot.weixin.exception.WxApiException;
import com.mxixm.fastboot.weixin.module.media.WxMediaResource;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.util.StringUtils;
import org.springframework.web.context.ServletContextAware;

import javax.servlet.ServletContext;
import java.io.IOException;

/**
 * FastBootWeixin  WxJaxb2RootElementHttpMessageConverter
 * 覆盖默认的ResourceHttpMessageConverter,因为默认的支持不完善

 * @author Guangshan
 * @summary FastBootWeixin  WxJaxb2RootElementHttpMessageConverter
 * @Copyright (c) 2017, Guangshan Group All Rights Reserved
 * @since 2017/8/23 22:31
 */
public class WxMediaResourceMessageConverter extends ResourceHttpMessageConverter implements ServletContextAware {

	private ServletContext servletContext;

	/*
	本想支持所有类型的,但是想想没有必要,也不好处理,干脆值覆盖父类的功能
	还有也不直接支持File文件,不想写了
	@Override
	protected boolean supports(Class clazz) {
		return WxWebUtils.isMutlipart(clazz);
	}*/
	@Override
	protected Resource readInternal(Class clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException {

		WxMediaResource wxMediaResource = new WxMediaResource(inputMessage);
		if (wxMediaResource.isUrlMedia() && !clazz.isAssignableFrom(WxMediaResource.class)) {
			throw new WxApiException("不支持的返回类型,接口返回了url");
		}
		if (InputStreamResource.class == clazz) {
			return new InputStreamResource(wxMediaResource.getInputStream());
		} else if (clazz.isAssignableFrom(WxMediaResource.class)) {
			return wxMediaResource;
		} else if (clazz.isAssignableFrom(ByteArrayResource.class)) {
			return new ByteArrayResource(wxMediaResource.getBody());
		} else if (clazz.isAssignableFrom(FileSystemResource.class)) {
			return new FileSystemResource(wxMediaResource.getFile());
		}
//		else if (clazz.isAssignableFrom(File.class)) {
//			return wxMediaResource.getFile();
//		}
		throw new WxApiException("不支持的返回类型");
	}

	@Override
	protected MediaType getDefaultContentType(Resource resource) {
		MediaType contentType = null;
		if (resource instanceof WxMediaResource) {
			contentType = ((WxMediaResource) resource).getContentType();
		}
		if (contentType == null && servletContext != null && resource.getFilename() != null) {
			String mimeType = servletContext.getMimeType(resource.getFilename());
			if (StringUtils.hasText(mimeType)) {
				contentType = MediaType.parseMediaType(mimeType);
			}
		}
		if (contentType != null) {
			return contentType;
		}
		return super.getDefaultContentType(resource);
	}

	protected void addDefaultHeaders(HttpHeaders headers, Resource t, MediaType contentType) throws IOException {
		// 忽略被选择出来的类型,因为如果有选择出来的类型,会影响getDefaultContentType的获取
		super.addDefaultHeaders(headers, t, null);
		// 如果super真的拿不到contentType时,取传入的contentType
		if (headers.getContentType() == null && contentType != null) {
			headers.setContentType(contentType);
		}
	}

	@Override
	public void setServletContext(ServletContext servletContext) {
		this.servletContext = servletContext;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy