说道文件上传下载,这个业务需求并不是很复杂思想如下
1.将文件上传到 某台服务器上的指定的路径下也可以这样理解
文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地
2.将路径同文件名等等相关的信息存储入库''
3.完成
思考一下哈:
1.所谓文件上传就是文件的一个复制过程对吧
2.文件在传输的过程中是以怎样的形式进行传输的
众所周知哈就是以流的形式进行传输的那么流到底是什么,这里我的见解哈流就是二进制的字节数组byte[]
3.一说到流我们就会想到的是io流对吧其 基本理论知识 都是死的就是流的分类,怎样使用这些实体类,怎样更快应为我是初级,所以我的理解就在这里。见笑了哈哈。
代码展示一下
public static void main(String[] args) { String name = "aaa"; try { InputStream is = new FileInputStream ("D:\\c.jpg"); OutputStream os = new FileOutputStream ("D:\\DaiMa\\2020914203533\\src\\com\\zkp\\test\\controller\\image\\"+name+".jpg"); byte[] buffer = new byte[1024]; int len = 0; while((len=is.read(buffer))>0){ os.write(buffer,0,len); } is.close(); os.close(); System.out.println("文件上传成功"); } catch (Exception e) { System.out.println( "文件上传失败"); e.printStackTrace(); }}
上边代码没啥技术含量但就是想展示一下哈哈,咱们得一步一步走
图片上传需要和前端进行配合,这里我们就需要进行接收前端传来的图片数据
前端图片数据的类型:
Multiplefile 或者是Multiplefile[]
base64
Multiplefile具体实现:
@RequestMapping(value = "/addPhoto",produces = "text/html;charset=utf-8")@ResponseBodypublic String upFile(String name , MultipartFile fil , ModelMap map, HttpServletRequest request) throws IOException { //一.进行接收我们前边传来的参数 //1.获取文件的名字 String name1 = fil.getName(); //2.进行获取大小 long size = fil.getSize(); //3.进行获取类型 String contentType = fil.getContentType(); //4.进行获取文件全名 String originalFilename = fil.getOriginalFilename(); //5.进行全部输出 System.out.println("名字1"+name1); System.out.println("大小"+size); System.out.println("类型"+contentType); System.out.println("文件 全名"+originalFilename); //进行创建文件的存储的名字,这里我们不能使其出现重复所以我们使用的是随机 //文件名:UUID+上传文件的扩展名 String pictureName = UUID.randomUUID().toString() +originalFilename.substring(originalFilename.lastIndexOf(".")); System.out.println("文件的新名字"+pictureName); //System.out.println(pictureName); map.put("a",name1); map.put("b",size); map.put("c",contentType); map.put("d", originalFilename); map.put("e",pictureName); Pic pic = new Pic(); pic.setNane1(name1); pic.setAllName(pictureName); pic.setName2(name); pic.setSize(size); pic.setType(contentType); try { //文件名 转移转换 新的文件 文件存放的地址 文件名 String path = request.getServletContext().getRealPath("")+"/images"; System.out.println(path); File file = new File(path,"aaa"+originalFilename.substring (originalFilename.lastIndexOf("."))); if (!file.exists()){ file.mkdirs(); } fil.transferTo(file); } catch (IOException e) { e.printStackTrace(); request.setAttribute("success","添加成功"); return "error"; } request.setAttribute("error","添加失败"); return "okPage";}
当然也能这样进行实现
@RequestMapping(name="/upload",produces = "text/html;charset=utf-8")@ResponseBodypublic String upload(MultipartFile file, String username, HttpServletRequest request){//对象名必须和name相同 System.out.println("username"+username); try { String name = file.getOriginalFilename(); Random random = new Random(); String fileName = System.currentTimeMillis()+""+random.nextInt(10000); file.transferTo(new File("D:/"+fileName)); } catch (IOException e) { e.printStackTrace(); return "上传失败"; } return "上传成功";}
base64具体实现(直接进行调用就可)
/** * 将base64数据转为二进制数据并上传到指定文件夹 * @param path * @param base64 * @return */ public static boolean base64ToImage(String path,String base64){ boolean flag = true; OutputStream outputStream = null; try { byte[] bytes = new BASE64Decoder().decodeBuffer(base64); for (int i = 0; i < bytes.length; i++) { if(bytes[i]<0){ bytes[i]+=256; } } outputStream = new FileOutputStream(path); /** * 将数据写出 */ outputStream.write(bytes); } catch (IOException e) { e.printStackTrace(); flag=false; }finally { if (outputStream!=null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return flag; }
补充将图片转换为base64
/** * 将图片转换为base64 * @return */ public static String imageToBase64( String imagePath ){ /** * 1.将本地图片转换为字节数据 */ InputStream inputStream = null; byte[] buffer = null; try { inputStream = new FileInputStream(imagePath); int count=0; while (count==0){ count = inputStream.available(); } buffer=new byte[count]; inputStream.read(buffer); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if(inputStream!=null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } String result = new BASE64Encoder().encode(buffer); System.out.println(result); return result; }
上边就是我遇到的常用的方式,还有就是创建文件的时候
如:
D:\\c.jpg我理解为带后缀为文件,不带的为文件夹哈哈,因为我是自学的,所以好多东西需要自己摸索,见谅了.
扩展:
添加多个文件MultipartFile[]
@Overridepublic String insertUser3(User userRegist, MultipartFile[] fil, HttpServletRequest request) { //进行遍历 for (int i = 0; i MultipartFile picture = fil[i]; String name = picture.getName(); long size = picture.getSize(); String originalFilename = picture.getOriginalFilename(); String fileName=System.currentTimeMillis() +picture.getOriginalFilename().substring(picture.getOriginalFilename().lastIndexOf(".")); String path1 = request.getServletContext().getRealPath("")+"static\\img2\\"; System.out.println("项目所在的路径为"+path1); //创建文件夹对象 File file=new File(path1+fileName); if(!file.getParentFile().exists()){//如果文件夹不存在 System.out.println("====================进行创建了文件===================="); file.getParentFile().mkdir();//创建文件夹 } try { picture.transferTo(file); System.out.println(""); System.out.println("文件上传成功"); } catch (IOException e) { e.printStackTrace(); } System.out.println("第"+i+"个图片是"+name+"数据的长度是"+size+"另一个名字是"+originalFilename); } return "创建成功";}
至于前端实质上就是发送post请求,这个请求怎样实现呢就是form表单提交或者是ajax进行发送。
<form action="addPhoto" method="post" enctype="multipart/form-data"> 用户姓名:<input type="text" value="" name="name"> <br/> 用户头像:<input type="file" value="" name="fil"> <br/> <input type="submit" value="提交"> form>
我可能整理的比较乱但是,要是有啥好的建议随时沟通
之一ajax进行发送就是使用key-value的方式进行实现,value就是图片转换为base64的值
这里base64就是实质上就是进行编码和进行解码编码就是将二进制的
byte[ ]数组转换为String类型的字符串,解码就是将tring类型的字符串转换为byte[ ]类型的二进制数组
总而言之就是数据格式的抓换和文件位置的转换,还是天上飞的理论总有落地的实现
在加点:就是前端传来数据,这个护具就是base64或者是流(就是二进制数组)后端进行接收,前端怎样传来后端怎样接收,上有政策下有对策哈哈。 反正我就知道这两种形势,你要是有知道的随时联系我哈哈,咱们互相进步
有问题加微信联系哦!