http不使用Form表单发送文件数据和非文件数据(上传篇)

这里要说一下,本篇我重点说的是上传,至于下载,查看对应的下载篇

在原来,文件的上传是使用form表单去提交,有的时候为了上传文件,还要专门为上传文件写一个form表单上传文件,十分的麻烦,探索宇宙已经很累了,哪有时间浪费啊!!^_^

正式进入主题

先看看怎么从html页面中发送文件,回答是:使用 FormData

FormData使用h5新添加的一个对象,可以用来包装要发送的数据,一个例子

<body>
    <form>
        <label for="">上传文件</label>
        <input type="file" id="picture" />
        <input type="button" value="确认提交" onclick="confirm()">
    </form>
    
    <script>
        function confirm(e){
            var xmlHttp;
            if(window.XMLHttpRequest){
                xmlHttp = new XMLHttpRequest();
            }else{
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            //构造FormData对象
            var formData = new FormData();
            //添加非文件数据
            formData.append("username","123456");
            formData.append("password","67890");
            //添加文件数据
            formData.append("picture",document.getElementById("picture").files[0])
            //使用POST方法发送数据
            xmlHttp.open("POST","/imageUpload",true);
            xmlHttp.send(formData)
            //返回的数据
            xmlHttp.onreadystatechange=function(){
                if (xmlHttp.readyState==4 && xmlHttp.status==200){
                    console.log(xmlHttp.responseText);
                }
            }
        }
    </script>
</body>

如上所述,你就已经发送了

{
    username:123456,
    password:67890,
    picture:文件数据(其实这里是将文件转换为二进制了)
}

我们可以看见使用FormData添加数据非常的简单,特别是解决了在上传文件只能使用form表单的憋屈。
下面我要说说,使用FormData包装好的数据怎么传输的,我想这是非常有必要的,特别是当你在后端解析数据的时候,必须要知道传给后台的数据长什么样

使用FormData后,会将request的Content-Type设置为

“multipart/form-data;boundary=----"+一段随机的字母;

上面的boundary正如字面的意思一样,就是一个分界的意思,分开每一个键值对数据,具体的数据格式为

--boundary(换行)
Content-Disposition:form-data;name=“数据的键”(换行)
\r\n(换行)
数据的值(“换行”)

注意每一个boundary的前面要加两个“-”
对于文件的数据格式为:

—boundary(换行)
Content-Disposition:form-data;name=“数据的键”;filename=“文件名”(换行)
\r\n
Content-Type:*/*(换行)
\r\n
文件的二进制编码

用我们前面的例子,发送的数据为:

--boundary
Content-Disposition:form-data;name="username"
\r\n
123456
--boundary
Content-Disposition:form-data;name="password"
\r\n
67890
--boundary
Content-Disposition:form-data;name="picture";filename="上传的文件名"
\r\n
Content-Type:image/jpeg;
对图片进行二进制编码后的数据
--boundary--

上面的boundary是一个变量,可以是一串随机数,不过FormData默认是四个"-"加一串随机数。
在最后也要添加一个分界,不一样的是在分界的前后各加了两个"-",表示数据发送完毕。

至此上传篇结束了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现文件上传,可以使用Java的HttpURLConnection类结合multipart/form-data格式实现,具体实现步骤如下: 1. 创建URL对象,指定要提交的URL地址。 2. 调用URL对象的openConnection()方法,获得HttpURLConnection对象。 3. 设置HttpURLConnection对象的请求方法,如POST。 4. 设置HttpURLConnection对象的其他请求参数,如请求头信息、Cookie等。 5. 设置HttpURLConnection对象的输出流,用于向服务器写入提交的数据。 6. 设置输出流的内容为multipart/form-data格式,包括boundary等信息。 7. 写入表单数据到输出流中,包括文件上传的字段名、文件名、文件内容等信息。 8. 调用HttpURLConnection对象的connect()方法,建立连接。 9. 向输出流中写入提交的数据。 10. 调用HttpURLConnection对象的getResponseCode()方法,获得服务器响应码。 11. 如果响应码为200,则调用HttpURLConnection对象的getInputStream()方法,获得服务器返回的数据流。 12. 读取数据流中的数据,进行处理。 下面是一个简单的示例代码: ```java URL url = new URL("http://example.com/upload"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); File file = new File("path/to/file"); String boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"; String CRLF = "\r\n"; String charset = "UTF-8"; OutputStream output = conn.getOutputStream(); output.write(("--" + boundary + CRLF).getBytes(charset)); output.write(("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"" + CRLF).getBytes(charset)); output.write(("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName()) + CRLF).getBytes(charset)); output.write(("Content-Transfer-Encoding: binary" + CRLF).getBytes(charset)); output.write((CRLF).getBytes(charset)); Files.copy(file.toPath(), output); output.write((CRLF + "--" + boundary + "--" + CRLF).getBytes(charset)); output.close(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream input = conn.getInputStream(); // 处理服务器返回的数据 } conn.disconnect(); ``` 注意事项: - 需要指定Content-Type为multipart/form-data,并设置boundary参数。 - 在写入表单数据时需要加上boundary和Content-Disposition等信息。 - 文件内容需要通过文件流写入输出流中,不能使用writer等字符流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值