springboot multipart/form-data;文件上传请求组装

springboot multipart/form-data;文件上传请求组装

工作需要后台上传文件。自行组装文件上传类

form-data 文件的基本形式
  • 1、请求体需分隔符:-----------------------------152909417026772332233306781192来组装。一个分隔符下一个请求参数。分隔符是随机的。
  • 2、最后一个参附上文件描述和文件的字节流
  • 3、以分隔符加--标记结尾: -----------------------------152909417026772332233306781192--
/**
 * ========================   请求体范例    ===========================
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="type"
 *
 * image
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="app_id"
 *
 * 1643192118890183
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="is_waterlog"
 *
 * 1
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="save_material"
 *
 * 1
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="no_compress"
 *
 * 0
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="is_events"
 *
 *
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="article_type"
 *
 * news
 * -----------------------------152909417026772332233306781192
 * Content-Disposition: form-data; name="media"; filename="timg.jpeg"
 * Content-Type: image/jpeg
 *
 * {这里是文件流}
 * -----------------------------152909417026772332233306781192--
 */
代码

import org.apache.http.util.ByteArrayBuffer;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.FileNameMap;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * 请求中  form-data 的抽象
 */
public class FileFormData {

    private static final String ENCODE = "utf-8";
    //分隔符号
    private static String delimiter = "7dc641c2e0260";
    //自定body
    private static HashMap<String, String> paramMap;
    //文件body参数
    private static String fileFiledName;
    private static String fileName;
    private static String fileType;
    private static String fileUrl;

    /**
     *
     * @param fileFiledName 表单文件部分的filedname:    Content-Disposition: form-data; name="{fileFiledName}"; filename="timg.jpeg"
     * @param fileName      表单文件部分的filename:     Content-Disposition: form-data; name="{fileFiledName}"; filename="{fileName}"
     * @param fileType      表单文件部分的content-type: Content-Type: {fileType}
     * @param fileUrl       文件资源定位符
     */
    public FileFormData(String fileFiledName, String fileName, String fileType, String fileUrl){
        paramMap = new HashMap<>();
        FileFormData.fileFiledName = fileFiledName;
        FileFormData.fileName = fileName;
        FileFormData.fileType = fileType;
        FileFormData.fileUrl = fileUrl;

    }
    public static String getDelimiter() {
        return delimiter;
    }

    /**
     * 分隔符设定。需指定分隔符时使用
     * @param delimiter
     */
    public static void setDelimiter(String delimiter) {
        FileFormData.delimiter = delimiter;
    }

    /**
     * 获取header contextType 一般是默认的。只需覆盖header就行。
     * 但如果特殊平台检测上传分隔符, 则需先设置 特有的分隔符
     * 其他关键参数默认随之生成
     * context-type: multipart/form-data;boundary=---------------------------{delimiter}
     * 分隔符: -----------------------------{delimiter}\r\n
     * 终止符: -----------------------------{delimiter}--\r\n
     * @param delimiter
     */
    public String getHeaderContextType(String delimiter) {
        FileFormData.delimiter = delimiter;
        return  "multipart/form-data; boundary=---------------------------" + FileFormData.delimiter;
    }

    String getHeaderContextType() {
        return  "multipart/form-data; boundary=---------------------------" + FileFormData.delimiter;
    }
    public void put(String key, String val){
        paramMap.put(key, val);
    }
    byte[] getFormDataBody() throws IOException {
        String delimiter = "-----------------------------"+ FileFormData.delimiter +"\r\n";
        String over = "-----------------------------"+ FileFormData.delimiter +"--\r\n";

        //自定参数组装
        ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(10);
        for (Map.Entry<String, String> param : paramMap.entrySet()) {
            if (!((param.getKey() == null) || (param.getKey().length() == 0))) {
                byte[] headByte = delimiter.getBytes(ENCODE);
                byteArrayBuffer.append(headByte, 0, headByte.length);
                String textTemplate = "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n";
                String text = String.format(textTemplate, param.getKey(), param.getValue());
                byte[] textByte = text.getBytes(ENCODE);
                byteArrayBuffer.append(textByte, 0, textByte.length);
            }
        }
        //当传入的fileType为空时 获取content-type
        if(FileFormData.fileType.equals("")){
            FileNameMap fileNameMap = URLConnection.getFileNameMap();
            FileFormData.fileType = fileNameMap.getContentTypeFor(fileUrl);
            System.out.println("file type:"+FileFormData.fileType);
        }

        //文件参数组装
        String end = "\r\n";
        String textTemplate = "Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n";
        textTemplate += "Content-Type: %s\r\n\r\n";
        String fileFormHeadStr = String.format(textTemplate, fileFiledName, fileName, fileType);
        byte[] headBytes = fileFormHeadStr.getBytes(ENCODE);
        byte[] fileDatas = null;
        byte[] endBytes = end.getBytes(ENCODE);
        // over 是最重的终止符号,终止后整个请求body组装完毕
        byte[] overBytes = over.getBytes(ENCODE);

        //加载文件的字节流
        URL url = new URL(FileFormData.fileUrl);
        URLConnection con = url.openConnection();
        InputStream is = con.getInputStream();

        if (is == null) return new byte[0];
        fileDatas = StreamUtil.convertToBytes(is);
        ByteArrayOutputStream totals = new ByteArrayOutputStream();
        totals.write(byteArrayBuffer.toByteArray());
        totals.write(delimiter.getBytes(ENCODE));
        totals.write(headBytes);
        if (fileDatas != null) {
            totals.write(fileDatas);
        } else {
            totals.close();
            return new byte[0];
        }
        totals.write(endBytes);
        totals.write(overBytes);
        byte[] resTotals = totals.toByteArray();
        totals.close();
        System.out.println(totals.toString());
        return resTotals;
    }
}

使用范例
FileFormData postForm = new FileFormData("media","abc.jpg", "image/jpeg", "图片的完整可访问路径");
		  postForm.put("type","image");
		  postForm.put("666","666");
		  postForm.put("777","777");
		 String url = "上传地址";
		 byte[] body = postForm.getFormDataBody();
		 //header 自定
		 //将body作为请求体发起请求即可。

以上

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
毕业设计,基于SpringBoot+Vue+MySQL开发的社区医院管理系统,源码+数据库+毕业论文+视频演示 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的社区医院管理系统实现了病例信息、字典表、家庭医生、健康档案、就诊信息、前台、药品、用户、用户、用户表等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让社区医院管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。 关键字:社区医院管理系统;信息管理,时效性,安全性,MySql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值