美文网首页
上传真的像你想象的那么简单吗

上传真的像你想象的那么简单吗

作者: 一个好汉 | 来源:发表于2021-06-29 23:51 被阅读0次
上传

上传

上传在系统中是非常常见的功能
主要分为俩种方式上传 :

  1. 流文件(大小根据你的配置而定)
  2. 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的字符串

上传思路如下

  1. 去除头部跟文件内容不相关的字符串 这里使用字符串的replace方法
  2. 使用base64工具类将base64转化为二进制数组
  3. 最后将二进制数组写到文件中即可

验证

可以使用postman进行测试
流形式的话可以直接选择文件上传即可


流形式

base64 你可以在线找个网站直接进行base64转码
然后填到字段里面就可以了

相关文章

网友评论

      本文标题:上传真的像你想象的那么简单吗

      本文链接:https://www.haomeiwen.com/subject/ttklultx.html