文件上传,base64和MultipartFile

1 篇文章 0 订阅

文件上传,base64和MultipartFile

1.用base64的方式上传

js文件转base64:

function tranformImgToBase64(dom,fileObj) {
    var reader = new FileReader();
    //使用该对象读取file文件
    reader.readAsDataURL(fileObj);
    // dialog.loading.open('图片添加中');
    //读取文件成功后执行的方法函数
    reader.onload = function (e) {
        //获取图片转换后的base64码
        base64 = e.target.result;
    }
}

java上传文件:

public String upload(String localFile) {
    try {
        String baseStr = localFile.split(",")[1];
		//base64解码
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytes1 = decoder.decodeBuffer(baseStr);
	    String fileName = "operation"+sformant.format(new Date())+".jpg";
	    //转文件流
        InputStream inputStream = new ByteArrayInputStream(bytes1);
        ftpClient.setControlEncoding("UTF-8"); // 中文支持
		// 设置文件类型(二进制)
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        ftpClient.enterLocalPassiveMode();
		// 设置上传目录
        ftpClient.changeWorkingDirectory(ftpUploadDirectory+"operation/");
        ftpClient.storeFile(fileName, inputStream);
        inputStream.close();
        return ftpUploadPath+"operation/" + fileName;
    } catch (IOException e) {
        e.printStackTrace();
    } 
    return "";

ps:上传多个文件时,文件名用时间格式命名会出现文件上传太快,时间没变化,会出现文件覆盖。可以选择用uuid或者自定义增长。

用base64上传会出现的问题:
1.图片太大,后端接收数据为null,抛空指针异常
网络答案:post请求理论上对参数的大小没有限制,但是服务器有限制,tomcat默认是2M,把Tomcat的server.xml里设置一下就好了
注:Tomcat的版本低于等于7,设置maxPostSize=“0” 表示post参数无限大
Tomcat的版本大于等于8,设置maxPostSize=“104857600” 表示post参数最大100MB

ps:我做的是hybris项目,tomcat默认的是5M,但我上传大于1M但不超过2M的数据还是会出现这种情况,建议避免用base64进行文件上传。

2.用MultipartFile进行文件上传

//配置multipart解析器:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="defaultEncoding">
      <value>UTF-8</value>
   </property>
   <property name="maxUploadSize">
      <value>10485760</value>
   </property>
   <property name="maxInMemorySize">
      <value>4096</value>
   </property>
</bean>

ps:用MultipartFile接收文件,需要配置解析器,不然就收不到数据(无法转化)。

js ajax请求进行文件上传

var formData = new FormData()
//循环添加到formData中
imgArr[index].forEach(function (file) {
    formData.append("file", file, file.name);
});
$.ajax({
    url: ACC.config.encodedContextPath + "/fileUpload/uploadImg",
    type: 'POST',
    async: false,
    data: formData,
    processData: false,// 不处理数据
    contentType: false,
    enctype: 'multipart/form-data',
    success: function (result) {
        if (result.code == 0) {
            obj.img = result.src;
        }
    }
});

ps:进行多个文件上传,循环放入formData,参数名和接收的参数名要保持一致。

java接收文件

@RequireHardLogIn
@PostMapping(value = "/uploadImg")
@ResponseBody
public Map<String, Object> uploadImg(MultipartFile[] file, String workDirectory) {
    Map<String, Object> resultMap = new HashMap<>();
    try {
        if (null != file) {
            resultMap.put("code", 0);
            FtpUtil ftpUtil = new FtpUtil();
            List<String> srcList = new ArrayList<>();
            for (int i = 0; i < file.length; i++) {
                String myFileName = file[i].getOriginalFilename();
                String uploadUrl = ftpUtil.upload(file[i], myFileName, workDirectory);
                srcList.add(uploadUrl);
            }
            ftpUtil.disconnet();
            resultMap.put("src", srcList);
            resultMap.put("msg", "文件上传成功!");
        } else {
            resultMap.put("code", 1);
            resultMap.put("msg", "文件为空!");
        }
    } catch (Exception e) {
        resultMap.put("code", 2);
        resultMap.put("msg", "文件上传异常!");
    } finally {
        return resultMap;
    }
}

进行ftp上传和base64原理一样,将文件转成流进行上传即可。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值