简体   繁体   English

使用HTTPWebrequest上传文件(不传递,发布数据)

[英]Upload a file using the HTTPWebrequest(does not pass, post data)

I Tries to upload a file using the HTTPWebrequest(multipart/form-data). 我尝试使用HTTPWebrequest(multipart / form-data)上传文件。

So I see a few pages, and wrote the following code : 因此,我看到了几页,并编写了以下代码:

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-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();
}

But does not pass POST data.. Is there a part I missed? 但是不会传递POST数据。我错过了一部分吗?

HttpAnalyzer Post 'Data' (Formdata tab is 'No data to display') : HttpAnalyzer发布“数据” (Formdata选项卡为“无数据可显示”):

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

Content-Disposition: form-data; 内容处置:表单数据; name="Filename" NAME = “文件名”

Image.jpg image.jpg的

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

Content-Disposition: form-data; 内容处置:表单数据; name="Username" NAME = “用户名”

RedPetals RedPetals

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

Content-Disposition: form-data; 内容处置:表单数据; name="img"; NAME = “IMG”; filename="Image.jpg" 文件名= “image.jpg的”

Content-Type: application/octet-stream 内容类型:应用程序/八位字节流

??? ???

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

Response result : 回应结果

// echo var_dump($_POST); // echo var_dump($ _ POST); echo var_dump($_FILES); 回声var_dump($ _ FILES);

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


Resolved 解决

//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";

Here's my solution when I encountered this issue: 这是我遇到此问题时的解决方案:

Client: 客户:

 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);
        }

Controller: 控制器:

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM