上传
上传在系统中是非常常见的功能
主要分为俩种方式上传 :
- 流文件(大小根据你的配置而定)
- base64字符串(大小有限)
流文件上传
我这里使用的是springboot作为我接口的实现框架
package com.example.demo.uploader.web;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
/**
*
* @ClassName: UploaderController
* @Description: 流方式上传
* @author 洪晓鸿
* @date 2019年8月19日 下午4:58:18
*
*/
@Controller
public class UploaderController {
/**
*
* @param file
* @param request
* @param response
* @return
*/
@ResponseBody
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public Map<String, String> upload(@RequestParam("file") MultipartFile file, HttpServletRequest request,
HttpServletResponse response) {
if (file.isEmpty()) {
System.out.println("上传失败,请选择文件");
}
String fileName = file.getOriginalFilename();
String filePath = "D:\\temp\\";
// String filePath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
File dest = new File(filePath + fileName);
try {
file.transferTo(dest);
} catch (IOException e) {
System.out.println(e.toString());
}
System.out.println("uploader" + new Date());
Map<String, String> result = new HashMap<String, String>();
result.put("msg", "success");
result.put("data", "success");
result.put("status", "200");
return result;
}
}
以上代码中使用MultipartFile对象接受从前端接收到的文件流对象
这里需要注意的是前端的name属性要与这里的@RequestParam注解中名字对应
以上的路径以及很多地方都是直接写了常量
其实这里还是灵活一点好 动态获取类路径或者是项目的真实路径
然后再上传会好很多
base64字符串
package com.example.demo.uploader.web;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
/**
*
* @ClassName: UploaderController
* @Description: base64方式上传
* @author 洪晓鸿
* @date 2019年8月19日 下午4:58:18
*
*/
@Controller
public class UploaderController {
/**
*
* @param file
* @param request
* @param response
* @return
*/
@ResponseBody
@RequestMapping(value = "/upload/base64", method = RequestMethod.POST)
public Map<String, String> upload(@RequestParam("base64") String base64, HttpServletRequest request,
HttpServletResponse response) {
// 通过base64来转化图片
base64 = base64.replaceAll("data:image/jpeg;base64,", "");
// Base64解码
byte[] imageByte = null;
imageByte = Base64Utils.decodeFromString(base64);
for (int i = 0; i < imageByte.length; ++i) {
if (imageByte[i] < 0) {// 调整异常数据
imageByte[i] += 256;
}
}
// 生成文件名
String files = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
+ (new Random().nextInt(9000) % (9000 - 1000 + 1) + 1000) + ".jpg";
// 生成文件路径
String filename = "D:\\temp\\" + files;
try {
// 生成文件
File imageFile = new File(filename);
imageFile.createNewFile();
if (!imageFile.exists()) {
imageFile.createNewFile();
}
OutputStream imageStream = new FileOutputStream(filename);
imageStream.write(imageByte);
imageStream.flush();
imageStream.close();
} catch (Exception e) {
e.printStackTrace();
}
System.err.println(base64);
System.out.println("uploader" + new Date());
Map<String, String> result = new HashMap<String, String>();
result.put("msg", "success");
result.put("data", "success");
result.put("status", "200");
return result;
}
}
PS;
这里从前端接受到base64的字符串
上传思路如下
- 去除头部跟文件内容不相关的字符串 这里使用字符串的replace方法
- 使用base64工具类将base64转化为二进制数组
- 最后将二进制数组写到文件中即可
验证
可以使用postman进行测试
流形式的话可以直接选择文件上传即可
流形式
base64 你可以在线找个网站直接进行base64转码
然后填到字段里面就可以了
网友评论