springMvcは、multipart / form-dataメソッドがリクエストを送信し、フィルターのServletRequest.getParameterメソッドでパラメーターを取得できないという問題を完全に解決します

この記事では、それを使用することについてのみ説明し、その原理についてはあまり説明していません(私もそれを研究していないため)。この原理に精通している友人がそれを共有して、以下から始めることを願っています。

-------------------------------------------------- ----------------------------退屈な序文ですが、まだ言う必要があります--------------- -------------------------------------------------- -------------------------------------------------- -----

アップロードされたファイルをフロントエンドで処理しているときに問題が発生しました。multipart/ form-dataメソッドによって送信されたリクエストは、フィルターで使用できません。ServletRequest.getParameterメソッドは、一緒に送信されたパラメーターを取得できません。リクエスト情報(RequestPayload)を取得し、文字列を解析して目的のパラメーターを取得します。しかし!ServletRequest.getReader()は1回しか取得できません。requestPayloadがインターセプトから取り出されると、Springコントローラでパラメータとファイルを取得できなくなります。

ここで模索してみたところ、回り道であることがわかりましたが、springMVCインターフェースからパラメータを取得できるため、springが問題を非常によく解決していることになります。



乾物が来ました

mvcのソースコードを調べると、2つのクラスが見つかりました。

1.1。ServletRequestのorg.springframework.web.multipart.MultipartHttpServletRequest.javaクラスを実装しました(このクラスのgetParameterメソッドは、multipart / form-dataおよびnon-multipart / form-dataメソッドによってアップロードされたパラメーターを取得できます)

1.2。MultipartHttpServletRequest.javaを作成するためのOrg.springframework.web.multipart.MultipartResolver.javaクラス

使い方



2.1最初に、Spring構成ファイルでMultipartHttpServletRequestを構成します

<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
		p:defaultEncoding="UTF-8">
		<property name="maxUploadSize">
			<value>104857600</value>
		</property>
		<property name="maxInMemorySize">
			<value>4096</value>
		</property>
</bean>

2.2 MultipartHttpServletRequestをインターセプトに挿入する

// 用于创建MultipartHttpServletRequest
private MultipartResolver multipartResolver = null;
	
@Override
public void init(FilterConfig arg0) throws ServletException {
// 注入bean
	multipartResolver = ((MultipartResolver)ApplicationContextUtil.getContext().getBean("multipartResolver", MultipartResolver.class));
}


 
 

2.3最上位のインターセプターでServletRequestをMultipartHttpServletRequestに置き換えます

        /**
	 * 获取 request
	 * @param req
	 * @return
	 */
	private ServletRequest getRequest(ServletRequest req){
		String enctype = req.getContentType();
		if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))
			// 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数
			return multipartResolver.resolveMultipart((HttpServletRequest) req);
		else 
			return req;
	}


2.4上記2.3のgetRequest(req)で取得したMultipartHttpServletRequestをchain.doFilter(MultipartHttpServletRequest、resp)に渡し、リクエストの実行を継続させます。すべてのインターセプターとコントローラーがパラメーターを取得し続けることができる後

2.5なくなった






元の記事を17件公開 24 件を獲得 28万回以上表示

おすすめ

転載: blog.csdn.net/qq_22956867/article/details/51437905
おすすめ