C#用HttpWebRequest上传数据的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#用HttpWebRequest上传数据的问题。相关的知识,希望对你有一定的参考价值。

我写了下面一段代码。
哪些地方写的不太妥当?请高手给些建议。谢谢

/// <summary>
/// 数据上传到Web服务器
/// </summary>
/// <param name="address"></param>
/// <param name="data"></param>
/// <returns></returns>
private string UploadData(string address, string data)

string sReturnString = "";
HttpWebRequest httpReq = null;
WebResponse httpRespon = null;

// HttpWebRequest对象
httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST";
byte[] dataBytes = Encoding.UTF8.GetBytes(data);

//不使用缓存
httpReq.AllowWriteStreamBuffering = false;

//Timeout(5秒)
httpReq.Timeout = 5000;
httpReq.ContentType = "text/xml";
httpReq.ContentLength = dataBytes.Length;
httpReq.Headers = this.Headers;
using (Stream postStream = httpReq.GetRequestStream())

//Request写入
postStream.Write(dataBytes, 0, dataBytes.Length);


try

//取得服务器返回的Response
httpRespon = httpReq.GetResponse();
using (Stream s = httpRespon.GetResponseStream())

using (StreamReader sr = new StreamReader(s))

//取得服务器返回的字符串
sReturnString = sr.ReadToEnd();




catch (WebException ex)

sReturnString = SoraSecurity.EncryptString("Error::" + ex.Message);

finally

if (httpReq != null) httpReq.Abort();
if (httpRespon != null) httpRespon.Close();


return sReturnString;

100分帮忙看一下好么?
.NET Compact Framework没有WebClient这个类。
我就是想要实现跟WebClient.UploadString();同样的功能。
数据上传我测试过已经没问题了。我怕自己写的有哪里资源没有释放。

这个方法最后可能会在一个While(true)死循环里反复执行。执行的时候不一定连得上服务器。
如果是windows可能不在乎这点内存。但对Windows Mobile来说内存太重要了。

Request可以当成全局变量同url一起传进来
在方法里只修改Reqest的访问地址就可以了
也就是不用没次都要给Request分配内存 你不是要循环的吗
其它的都没什么问题
参考技术A 你的说出你程序中的问题和想知道的东西,直接看你这个东西,有点累!

上传图像多部分表单 HTTPWebRequest - 将图像数据转换为字符串?

【中文标题】上传图像多部分表单 HTTPWebRequest - 将图像数据转换为字符串?【英文标题】:Uploading Image MultiPart Form HTTPWebRequest - Getting Image Data To String? 【发布时间】:2012-12-04 18:57:02 【问题描述】:

我正在尝试使用 HTTPWebRequest 上传一个多部分表单,在我添加要上传的图像之前一切正常,主要是我尝试执行与浏览器发出的完全相同的请求,如下所示:

-----------------------------41184676334
Content-Disposition: form-data; name="file"; filename="guitar tape.jpg"
Content-Type: image/jpeg

IMAGEDATAHERE
-----------------------------41184676334
Content-Disposition: form-data; name="save"

save
-----------------------------41184676334--

我不知道如何格式化/读取图像以将其设置为我在下面提出的请求:

            Dim boundary As String = "-----------------------------" & DateTime.Now.Ticks.ToString("x")
        Dim req As HttpWebRequest = DirectCast(WebRequest.Create("http://www.mysite.com/upload.php"), HttpWebRequest)
        req.Method = "POST"
        req.ContentType = "multipart/form-data; boundary=" & "---------------------------" & DateTime.Now.Ticks.ToString("x")
        req.KeepAlive = False
        Dim builder As New StringBuilder()
        builder.Append(boundary & vbCrLf & "Content-Disposition: form-data; name=""variable1""" & vbCrLf & vbCrLf & "1" & vbCrLf)
        builder.Append(boundary & vbCrLf & "Content-Disposition: form-data; name=""file""; filename=""" & FileName & """" & vbCrLf)
        builder.Append("Content-Type: application/octet-stream")
        builder.Append(vbCrLf & vbCrLf)
        ' Add Photo Here
        If UpdateImage = True Then
            ' Load Image
            Dim ImageData As System.Drawing.Image
            Dim fs As New System.IO.FileStream(ImagePath, System.IO.FileMode.Open)
            ImageData = Image.FromStream(fs)
            fs.Close()
            ' Add Image To Header
            builder.Append(ImageData)
            builder.Append(vbCrLf)
        Else
            builder.Append(vbCrLf)
        End If
        builder.Append(boundary & vbCrLf & "Content-Disposition: form-data; name=""save""" & vbCrLf & vbCrLf & "save")
        ' Footer Bytes
        Dim close As Byte() = Encoding.UTF8.GetBytes("--")
        Dim postHeader As String = builder.ToString()
        Dim postHeaderBytes As Byte() = Encoding.UTF8.GetBytes(postHeader)
        Dim boundaryBytes As Byte() = Encoding.ASCII.GetBytes(vbCrLf & boundary & "--" & vbCrLf)
        Dim length As Long = postHeaderBytes.Length + boundaryBytes.Length
        req.ContentLength = length
        Dim requestStream As Stream = req.GetRequestStream()
        Dim fulllength As Integer = postHeaderBytes.Length + boundaryBytes.Length
        ' Write out our post header
        requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length)
        ' Write out the trailing boundary
        requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
        Dim responce As WebResponse
        responce = req.GetResponse()
        requestStream.Close()
        Dim s As Stream = responce.GetResponseStream()
        Dim sr As New StreamReader(s)
        Dim Content As String = sr.ReadToEnd()

目前它只是将“System.Drawing.Bitmap”作为图像数据发布,但我不知道如何为看起来像这样的图像获取相同的原始数据:

    J©õݨe‚Lnž¿Ëã/ǧúÐ5ý¼C÷Cý>ß’t;fm—=Äw:�/E±ËÙÏ$á@%Pc>×    Šgw.²Ab“:ÅÓù:ϯÌh6à€Z§Ó‚g£®hÚD6¨Ø^Ú2ô`ä¨L�YÆÄÅCX#I“ÈÌãj¦L˜•’|¥�Eb¡ëQ–¤Ú, 3\UzL  öÔoj4�•±’u«c¼#„oÕ`îF>·o—ŠûÅ«ÎÑ™¶Ç˜ýº*i°œÈVŒ�Qû”Ñ[.�ÔmçE•ì¦eNCh�Ù
é§�É$m¿ôš"»ÌNæ(VÌmp›F¹XÈ88™ªüµ…d•XµÔÜ#�ˆŠv‘º‚F‚§Yûb

关于如何做到这一点或者我需要改变我的方法有什么想法吗?

【问题讨论】:

【参考方案1】:
    builder.Append(ImageData)

不正确。您需要将图像读取为字节,然后将 byte[] 添加到多部分帖子中。

详情请见Using HttpWebRequest to POST data/upload image using multipart/form-data

并确保使用 http 嗅探器(即 fiddler)查看它实际发送的内容。

首先,将图像加载到字节数组中,然后将其转换为base64:

imgBase64 = Convert.ToBase64String(my_image_byte_array)

【讨论】:

感谢您的回复,我之前尝试过此操作,它发布的内容如下:/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAICAgICAQICAgIDAgIDAwYEAwMDAwcFBQQGCAc (base64) 我想做的是发布示例数据中的实际图像数据。 如果您在 fiddler 中看到 base64 格式,那么您必须将其发布为 base64 格式。它是图像,只是格式不同。在服务器上,它将解码 base64 格式以保存图像。如果您发布原始数据,它将失败。 目前服务器响应是无效的图像,尽管发布的数据是 100% 好的,但实际图像数据的格式不同。 是的,反应很清楚。你发布了错误的数据。原始数据不是基于 base64 的,因此服务器接受数据,但无法将其转换为有效图像。这就是为什么响应“无效图像”。转换为 base64 见上文。 我将代码更改为: Dim ImageData() As Byte = File.ReadAllBytes(ImagePath) Dim NewImageData As String = Convert.ToBase64String(ImageData) 在此之后数据看起来像: /9j/4AAQSkZJR 而Fiddler 将正常上传显示为:J©õݨe‚Lnž¿Ëã/ǧúÐ5ý¼C 并且通过此更改,服务器响应 Invalid Image Type。【参考方案2】:

我的“OpenFileDialog”名称是“文件”。单击“按钮”时,会弹出一个对话框,用于选择 jpg、jpeg、png 图像文件,还可以添加 bmp 或任何图像文件类型。然后选择图像文件后,它将显示在“PictureBox”上,我将其命名为“picboxProfileID”。

在 Visual Basic 中:

  file.Filter = "image file (*.jpg, *.jpeg, *.png) | *.jpg; *.jpeg; *.png | all files (*.*) | *.*"
    If (file.ShowDialog <> Windows.Forms.DialogResult.Cancel) Then
        picboxProfileID.Image = Image.FromFile(file.FileName)
        picboxProfileID.ImageLocation = file.FileName
        txtName.Text = file.FileName
        My.Computer.Network.UploadFile(file.FileName, "http://localhost/VTVTS/uploadImageSample.php")
    Else
        picboxProfileID.Image = Nothing
    End If

上传文件的目的地将上传到创建的父文件夹php文件的“images/”。

在 PHP 中:

<?php
$response = array();
$image = $_FILES['file'];

$imageName = $image['name'];
$imageTmpName = $image['tmp_name'];
$imageSize = $image['size'];
$imageError = $image['error'];
$imageType = $image['type'];

$fileExt = explode('.', $imageName);
$fileActualExt = strtolower(end($fileExt));

$allowed = array('jpg', 'jpeg', 'png');
if(in_array($fileActualExt, $allowed))
    $fileNameNew = uniqid('', true).".".$fileActualExt;
    $fileDestination = 'images/'.$fileNameNew;
    $newDestination = move_uploaded_file($imageTmpName, $fileDestination);
    $response['error'] = false;
    $response['message'] = "Upload Image Successful";
else
    $response['error'] = true;
    $response['message'] = "You cannot upload files of this type!";

echo json_encode($response);

编码愉快!

【讨论】:

以上是关于C#用HttpWebRequest上传数据的问题。的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HttpWebRequest 模拟浏览器文件上传

c# WebBrowser登录后怎样直接用HttpWebRequest抓取数据

转asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端

C# 关于Time out的简单问题

在c#用httpwebrequest中发送get/http/https请求后,怎么获得数据

用c#编写webservice时,如何获取调用它的httpwebrequest中?后面的参数 非常感谢。