当前位置: 首页 > 知识库问答 >
问题:

使用HTTPWebrequest上载文件(不通过,发布数据)

双志强
2023-03-14

我尝试使用HTTPWebrequest(多部分/表单数据)上传文件。

所以我看了几页,写了以下代码:

var boundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes(boundary);

var template = boundary + "\r\n" +
               "Content-Disposition: form-data; name=\"{0}\"" + "\r\n\r\n" +
               "{1}\r\n";

// Request Header
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://domain.com/test.php");
req.Method = "POST";
req.KeepAlive = true;
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.CookieContainer = COOKIE;


Stream ms = new MemoryStream();

string formItem;
byte[] formItemBytes;

string fileName = Path.GetFileName(@"C:\Users\Username\Image.jpg");

// POST Data
formItem = string.Format(template, "Filename", fileName);
formItemBytes = Encoding.UTF8.GetBytes(formItem);
ms.Write(formItemBytes, 0, formItemBytes.Length);

formItem = string.Format(template, "Username", "RedPetals");
formItemBytes = Encoding.UTF8.GetBytes(formItem);
ms.Write(formItemBytes, 0, formItemBytes.Length);

var headerTemplate = "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-html" target="_blank">stream\r\n\r\n";
string header = string.Format(headerTemplate, "Image", fileName);
byte[] headerBytes = Encoding.UTF8.GetBytes(header);

ms.Write(boundaryBytes, 0, boundaryBytes.Length);
ms.Write(headerBytes, 0, headerBytes.Length);

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    byte[] buffer = new byte[1024];

    int bytesRead = 0;
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
    {
        ms.Write(buffer, 0, bytesRead);
    }
}

byte[] boundaryEndBytes = Encoding.ASCII.GetBytes(boundary + "--");
ms.Write(boundaryEndBytes, 0, boundaryEndBytes.Length);

req.ContentLength = ms.Length;

ms.Position = 0;
byte[] tempBuffer = new byte[ms.Length];
ms.Read(tempBuffer, 0, tempBuffer.Length);
ms.Close();

using(Stream rs = req.GetRequestStream())
{
    rs.Write(tempBuffer, 0, tempBuffer.Length);
}

HttpWebResponse response = (HttpWebResponse)req.GetResponse();
string result = "";

if (response.StatusCode == HttpStatusCode.OK)
{
    Stream resStream = response.GetResponseStream();
    StreamReader readStream = new StreamReader(resStream, Encoding.UTF8);
    result = readStream.ReadToEnd();

    Console.Write(result);

    resStream.Close();
    readStream.Close();
}

但不传递POST数据。。有我错过的部分吗?

HttpAnalyzer发布“数据”(Formdata选项卡为“无数据显示”):

----------8d1984e7dd49750

内容-处置:表单-数据;name="Filename"

我mage.jpg

----------8d1984e7dd49750

内容-处置:表单-数据;name="Username"

红花瓣

----------8d1984e7dd49750

内容配置:表单数据;name=“img”;filename=“Image.jpg”

内容类型:应用程序/八位字节流

???

----------8d1984e7dd49750--

响应结果:

//回显变量转储($\u POST);echo var_dump($_文件);

数组(0){}数组(0){}

//var boundary = "----------" + DateTime.Now.Ticks.ToString("x");
var boundary = "--------" + DateTime.Now.Ticks.ToString("x");

// var template = boundary + "\r\n" +
//                "Content-Disposition: form-data; name=\"{0}\"" + "\r\n\r\n" +
//                "{1}\r\n";
var template = "--" + boundary + "\r\n" +
               "Content-Disposition: form-data; name=\"{0}\"" + "\r\n\r\n" +
               "{1}\r\n";

共有1个答案

陈兴朝
2023-03-14

以下是我遇到此问题时的解决方案

客户:

 public async Task UploadImage(byte[] image, string url)
        {
            Stream stream = new System.IO.MemoryStream(image);
            HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream());

            Uri resourceAddress = null;
            Uri.TryCreate(url.Trim(), UriKind.Absolute, out resourceAddress);
            Windows.Web.Http.HttpRequestMessage request = new Windows.Web.Http.HttpRequestMessage(Windows.Web.Http.HttpMethod.Post, resourceAddress);
            request.Content = streamContent;

            var httpClient = new Windows.Web.Http.HttpClient();
            var cts = new CancellationTokenSource();
            Windows.Web.Http.HttpResponseMessage response = await httpClient.SendRequestAsync(request).AsTask(cts.Token);
        }

控制器:

public async Task<HttpResponseMessage> Post()
{
    Stream requestStream = await this.Request.Content.ReadAsStreamAsync();
    byte[] byteArray = null;
    using (MemoryStream ms = new MemoryStream())
    {
        await requestStream.CopyToAsync(ms);
        byteArray = ms.ToArray();
    }
    .
    .
    .
    return Request.CreateResponse(HttpStatusCode.OK);
}
 类似资料:
  • 我的本地计算机上有一个文件。我有一个Perl脚本可以通过SFTP连接将此文件复制到远程位置()。

  • 我有一组参数和一组图像,每组参数都包含一个且仅包含一个图像。我的代码 有了这个代码,我可以上传一个图像随着一个parameter.but我想发送数组中的参数和数组中的图像too.is上传数组参数与数组图像的方式?如果是如何跟踪图像和参数?

  • 我想通过Shrine上载器gem上载一个xls文件(Libreoffice),但是我得到了一个回滚错误,比如文件类型必须是一个..(在我的initializers/Shrine.rb中有mime类型)。这是我的神殿 这是我的shrine_uploader.rb 我可以上传xlsx文件,但是我不明白为什么我不能上传xls文件,即使mime类型是application/vnd.ms-excel。 谢谢

  • 我想运行一个Java应用程序。我使用JBoss服务器。我使用Maven。我使用Eclipse。我使用Eclipse将企业存档中的网络存档部署到服务器上。 对于小程序,我需要小程序的。applet.html的可访问文件夹中的类文件。我的想法是复制。class-从我的Web存档的目标文件夹到资源文件夹。所以我在Web-Maven-Project的pom.xml中添加了以下插件: 我想我把阶段和目标搞砸

  • 问题内容: 所以我知道有很多类似的帖子,但是我认为这足以满足自己的疑问: 我正在用PHP和jQuery构建XLS导出器。我正在尝试使用jQuery发布一个数组(我相信它与GET查询字符串一样长),并用它在我的服务器上生成XLS文件,然后用户可以下载该文件。 过去,我使用隐藏的iframe来完成此操作,但是由于它们只是重定向到url,因此这要求我使用GET,这使我感到紧张。 我的问题是:如果这些文件

  • 问题内容: 我正在开发一个远程备份应用程序,有时我需要上传大文件,例如15 MB,我已经在某些手机上进行了测试,但遇到内存不足错误 使用此功能是否可以使用更少的内存? 这里的错误日志 修改并添加固定无缓冲区后,出现此错误 我猜这差个字节是标题数据吗?如何获取标头的length()? 问题答案: 您应该使用HttpURLConnection 的or 方法。这将防止您的数据在内存中缓冲并耗尽。 文档中