利用WebRequest类上传文件

说明:1.WebRequest类是一个抽象类,所以上传类实际使用的是其子类

2.打开Fiddler软件,监视正常网页的文件上传,可以看到http协议的请求和响应信息,简略说明

(第一行:请求说明

POST http://localhost/UpLoad.aspx HTTP/1.1 (请求类型:post,请求地址: http://localhost/UpLoad.aspx,http协议类型:HTTP/1.1)

第二行至多行:请求头(一系列的 key:value)

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type: multipart/form-data;charset=utf-8;boundary=8D30475B6E5BB4C
Host:localhost
Content-Length: 22194
Expect: 100-continue
Connection: Close

换行,第n行:请求体

响应类似,详细见fiddler。

3.通过查看fiddler监测的http请求过程,可以利用webrequest模拟http请求,代码如下:

 private void UploadFile(string  path)
    {
        try
        {
            if (!string.IsNullOrEmpty(path))
            {
                string filename = Path.GetFileName(path); //获取文件名称
                LogWrite("上传文件", "开始上传文件,文件名称" + filename, null);
                string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/UpLoad.aspx");
                request.ServicePoint.ConnectionLimit = 50; //设置最大连接数
                request.Method = "POST"; //请求方法
                #region ==请求头===
                request.KeepAlive = false; //请求连接方式,设置为请求完成后断开连接
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                #endregion
                byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");//分割线数据
                byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");//结束分割线数据
                StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", filename));
                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); //上传文件头数据
                string sbheader2 = string.Format("Content-Disposition:form-data;name=\"ws\"\r\n\r\nother");//其他的form表单数据,这里为:form["ws"]="other"
                byte[] ddd = Encoding.UTF8.GetBytes(sbheader2);
                FileStream fs = new FileStream(path, FileMode.Open);//读取文件
                byte[] bArr = new byte[fs.Length];
                long filesize = fs.Length;
                fs.Read(bArr, 0, (int)filesize);
                fs.Close();
                request.ContentLength = itemBoundaryBytes.Length * 2 + ddd.Length + postHeaderBytes.Length + filesize + endBoundaryBytes.Length;//设置请求长度,一定要设置,否则可能会引发请求超时的异常
                Stream sm = request.GetRequestStream(); //获取请求流
                sm.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);//写入分割线数据
                sm.Write(ddd, 0, ddd.Length); //写入表单数据
                sm.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);//写入分割线数据
                sm.Write(postHeaderBytes, 0, postHeaderBytes.Length);//写入上传文件头数据

                long size = 0;
                float percent = 0; //上传进度
                //分步上传
                while (size < filesize)
                {
                    if (filesize - size > 1024)
                    {
                        sm.Write(bArr, (int)size, 1024);
                        size += 1024;
                    }
                    else
                    {
                        sm.Write(bArr, (int)size, (int)(filesize - size));
                        size = filesize;
                    }
                    percent = size / (float)filesize;
                }
                //sm.Write(bArr, 0, bArr.Length);

                sm.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); //写入结束分割线
                sm.Close();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //获取响应
                Stream sss = response.GetResponseStream();
                LogWrite("上传文件", response.StatusCode.ToString() + filename, null);

                //Stream sss = request.GetResponse().GetResponseStream();
                StreamReader sr = new StreamReader(sss);
                string ret = sr.ReadToEnd();
                sr.Close();
                LogWrite("上传文件", "结束上传文件,返回结果" + ret, null);
                //资源释放
                response.Close();
                request.Abort();
                System.GC.Collect();
            }
        }
        catch (Exception ex)
        {
            LogWrite("上传文件发生异常", "", ex);
        }

    }

4.注意:一定要设置request.ContentLength的大小,否则可能引发操作超时的异常信息。

时间: 2024-10-07 16:35:00

利用WebRequest类上传文件的相关文章

使用javax.servlet.http.Part类上传文件

使用的是Servlet 3.0 新的特征标注(Annotaion)类描述部署,一些低版本的服务器需要使用标准依赖部署描述文件(web.xml)来部署,另外Part也是Java EE 6.0新增的类,Part是一个接口继承于javax.servlet.http,代表一部分表单项目接收来自multipart/form-data的POST的请求. !DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <h

15. 利用ajax jquery 上传文件

通过jQuery Ajax使用FormData对象上传文件 字数664 阅读26857 评论18 喜欢18 FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用FormData对象 有详尽的FormData对象使用说明. 但上传文件部分只有底层的XMLHttpRequest对象发送上传请求,那么怎么通过jQuery的Ajax上传呢? 本文将介绍通过jQuery使用F

利用百度云盘API上传文件至百度云盘

一.获取Access Token示例 1. 请您将以下HTTP请求直接粘贴到浏览器地址栏内,并按下回车键. https://openapi.baidu.com/oauth/2.0/authorize?response_type=token&client_id=L6g70tBRRIXLsY0Z3HwKqlRE&redirect_uri=oob&scope=netdisk 2.执行后,弹出百度登录页面,登录后弹出以下授权页面: 3.授权后,将跳转到以下百度OAuth2.0页面: 4.请

C语言 HTTP上传文件-利用libcurl库上传文件

原文  http://justwinit.cn/post/7626/ 通常情况下,一般很少使用C语言来直接上传文件,但是遇到使用C语言编程实现文件上传时,该怎么做呢? 借助开源的libcurl库,我们可以容易地实现这个功能.Libcurl是一个免费易用的客户端URL传输库,主要功能是用不同的协议连接和沟通不同的服务器,libcurl当前支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP,IMAPS, LDAP, LDAPS, POP3, POP3

struts利用插件jqueryupload上传文件,后台处理文件代码

package cn.axhu.education.action.file; import cn.axhu.education.common.FileSystemConfig;import cn.axhu.education.common.utils.FileUtils;import net.ruixin.web.struts2.SimpleActionSupport;import org.apache.struts2.convention.annotation.Action;import or

小白向:web中利用request.getPart()上传文件到服务器

被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的"详"解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工程下的某个文件夹)中 2.明确过程 文件上传的过程涉及两个文件, 一个 .jsp文件,和 一个 servlet 文件. .jsp文件(upload.jsp):用户操作页面 =显示文件名的文本框+文件选择按钮(浏览...)+确认上传按钮 servlet文件(uploadServlet.java):根据.jsp中

FileUtils类上传文件图片

import java.io.File; import java.util.Scanner; import org.apache.commons.io.FileUtils; public class UploadFile { public static void main(String[] args){ Scanner sc = new Scanner(System.in); String SourceLocation = sc.nextLine(); String [] sources = S

工具类:自己总结的利用fileupload包上传文件的工具类!

package com.mage.util; import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; im

利用formdata对象上传文件时,需要添加的参数

function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'http://localhost:8080/cfJAX_RS/rest/file/upload' , type: 'POST', data: formData, async: false, cache: false, contentType: false, processData: false, success