mimemultipart java_java实现Multipart/form-data

这篇博客展示了如何在Java中使用Multipart/form-data上传文件。通过ServletFileUpload解析请求,将文件保存到临时存储室,然后写入指定目录,并处理表单字段。文章还包含了一个`saveFile`方法的详细实现。
摘要由CSDN通过智能技术生成

@Path("addContract.do")

@Consumes(MediaType.MULTIPART_FORM_DATA)

@Produces(MediaType.TEXT_HTML)publicString addContract(@Context HttpServletRequest request, @Context HttpServletResponse response){try{//这里根据业务做修改

Contract contract = newContract();//重点是调用saveFile方法

UploadResult uploadResult =saveFile(request);

contract.setShopId(Integer.valueOf(uploadResult.getParamMap().get("shopId")));

contract.setContractUrl(uploadResult.getFilePath());

Boolean success=contractService.addContract(contract);return JSON.toJSONString(RespApi.buildResp(200, "success", success));

}catch(ContractExeption contractExeption) {

log.warn(ExceptionUtils.getStackTrace(contractExeption));return JSON.toJSONString(RespApi.buildResp(400, "fail to add contract", false));

}

}publicUploadResult saveFile(HttpServletRequest request) {

Map resultMap = new HashMap<>();

String fileName= "";try{if(ServletFileUpload.isMultipartContent(request)) {

FileItemFactory factory= newDiskFileItemFactory();//如果没以下两行设置的话,上传大的 文件 会占用 很多内存,//设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同

/*** 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,

* 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的

* 然后再将其真正写到 对应目录的硬盘上*/

//这个tempDir需要自己设置

File tempF = newFile(tempDir);if (!tempF.exists()) {

tempF.mkdirs();

}

factory.setRepository(tempF);//设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室

factory.setSizeThreshold(1024 * 1024);//高水平的API文件上传处理

ServletFileUpload upload = newServletFileUpload(factory);

List items = null;try{

items=upload.parseRequest(request);

}catch(FileUploadException e) {

e.printStackTrace();

}if (items != null) {

Iterator iter =items.iterator();while(iter.hasNext()) {

FileItem item=iter.next();//属性字段

if(item.isFormField()) {//获取表单的属性名字

String name =item.getFieldName();

String value=item.getString();

resultMap.put(name,value);

}//文件

if (!item.isFormField() && item.getSize() > 0) {//可以得到流

InputStream in =item.getInputStream();

fileName=processFileName(item.getName());try{

String basePath=getRootPath();

String types= "pic";

String date=DateUtil.getNowDateStr(DateUtil.TO_DAY);

String realPath= basePath + File.separator + types + File.separator +date+File.separator;//String realPath = basePath + File.separator + types + File.separator + date//+ File.separator;

System.out.println(realPath);

File file1= newFile(realPath);if (!file1.exists()) {

file1.mkdirs();

}

String name= UUID.randomUUID().toString() + ".jpg";

fileName= types + File.separator + date + File.separator +name;

File files= new File(realPath +name);

item.write(files);

}catch(Exception e) {

e.printStackTrace();

}

}

}

}

}

}catch(Exception e) {

}

UploadResult uploadResult= newUploadResult();

uploadResult.setFilePath(fileName);

uploadResult.setParamMap(resultMap);returnuploadResult;

}//返回结果的包装类

public classUploadResult {privateString filePath;private MapparamMap;publicString getFilePath() {returnfilePath;

}public voidsetFilePath(String filePath) {this.filePath =filePath;

}public MapgetParamMap() {returnparamMap;

}public void setParamMap(MapparamMap) {this.paramMap =paramMap;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值