ios 使用h5在qq浏览器上上传时报错:
class org.apache.shiro.web.servlet.ShiroHttpServletRequest cannot be cast to class org.springframework.web.multipart.MultipartHttpServletRequest (org.apache.shiro.web.servlet.ShiroHttpServletRequest and org.springframework.web.multipart.MultipartHttpServletRequest are in unnamed module of loader 'app')
经过排查是因为"Content-Type"未自动设置为multipart/form-data; boundary=-WebKitFormBoundaryc7sJqt9sAQarzla9
手动添加后报错Cannot invoke "org.springframework.web.multipart.MultipartFile.getOriginalFilename()" because "mf" is null
前端代码
import axios from 'axios'
import store from '../store'
// 配置项
const service = axios.create({
// baseURL:'https://www.sunfengke.xyz/pc/',
baseURL:'http://172.168.0.206:9500/qydw-web/',
timeout: 300000, // 请求超时
})
// 请求拦截器
service.interceptors.request.use((config: any) => {
config.headers.Token = store.state.token
if (config.url=="/cmm/web/upload"){
config.headers={
Accept: "application/json, text/plain, */*",
Token: store.state.token,
"Content-Type":"multipart/form-data; boundary=----WebKitFormBoundaryc7sJqt9sAQarzla9"
}
}
return config
}, err => {
return Promise.reject(err)
})
export function get(url: string, params: any){
return new Promise((response, reject) => {
service({url, method: 'get', params}).then(res => {
response(res)
}).catch(err => {
reject(err)
})
})
}
后台:
@RestController
@RequestMapping("/cmm/web")
@Slf4j
@Api(tags="通用接口")
public class CmmWebController {
/**
* 文件上传
* @return
*/
@PostMapping(value = "/upload")
@ApiOperation(value = "文件上传", notes="文件上传通用接口")
@ApiParam(name="request", value = "请求信息")
public Result<?> fileUpload(HttpServletRequest request) {
// @RequestPart(value = "file") MultipartFile file,
Result<Map<String, String>> result = new Result<Map<String, String>>();
Map<String, String> fileNameMap = new HashMap<>();
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获取上传文件对象
MultipartFile mf = multipartRequest.getFile("file");
// file;
// multipartRequest.getFile("file");
// 获取原始文件名
String fileNameReal = mf.getOriginalFilename();
// 文件后缀
String suffix = fileNameReal.substring(fileNameReal.lastIndexOf("."));
// 获取文件名
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
// 存储文件
MinioUtil.putFileTemp(FileConstant.MINIO_BUCKET_TEMP, fileName, mf.getInputStream());
// MinioUtil
String fileUrl=MinioUtil.getFileUrl(FileConstant.MINIO_BUCKET_TEMP, fileName);
// result.setSuccess(true);
result.success("上传成功");
fileNameMap.put("fileName", fileName);
fileNameMap.put("fileNameReal", fileNameReal);
fileNameMap.put("fileUrl",fileUrl.replace("http://172.18.231.250:9000/","https://www.sunfengke.xyz/minio/"));
result.setResult(fileNameMap);
} catch (Exception e) {
result.setSuccess(false);
result.setMessage(e.getMessage());
log.error(e.getMessage(), e);
} finally {
}
return result;
}
boundary=----WebKitFormBoundaryc7sJqt9sAQarzla9
这个东西不是请求头里的吧
是的,是浏览器自动生成的,但是用ios的时候没有自动生成,所以报错了