PartList::getNamedPart(...)获取对象为空
PartList::getNamedPart(…)获取对象为空
场景
前端上传文件时,需要携带其它的描述信息,如:userId(用户id)、userName(用户名)等。
问题描述
auto userPart = multipart->getNamedPart("userId");
后端获取的userPart对象为空
原因
最常见的原因是您没有为该part设置PartReader,导致数据没有被读取。
所以:
ENDPOINT("POST", "upload", upload, REQUEST(std::shared_ptr<IncomingRequest>, request))
{ auto multipart = std::make_shared<oatpp::web::mime::multipart::PartList>(request->getHeaders()); oatpp::web::mime::multipart::Reader multipartReader(multipart.get()); // 为字段设置reader multipartReader.setPartReader("file", oatpp::web::mime::multipart::createFilePartReader("/tmp")); // file reader// 方法一:每个字段设置各自的readermultipartReader.setPartReader("userId",oatpp::web::mime::multipart::createInMemoryPartReader(1024)); // 1kb, memory readermultipartReader.setPartReader("userName",oatpp::web::mime::multipart::createInMemoryPartReader(1024)); // 1kb, memory reader// 方法二:或者为剩余所有字段设置默认的readmultipartReader.setDefaultPartReader(oatpp::web::mime::multipart::createInMemoryPartReader(16 * 1024)); // 16kb, memory reader// 读取multipart数据 request->transferBody(&multipartReader);
}
notes
- 必须在调用transferBody()之前设置PartReader,否则数据不会被读取到payload中
- setDefaultPartReader()可以为所有未明确指定reader的part设置默认处理方式
