上传图像的MultiPart表单HTTPWebRequest - 如何将图像数据转换为字符串?

3

我正在尝试使用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

你有什么想法可以帮我实现这个功能吗?还是说我需要改变我的方法?

2个回答

1
    builder.Append(ImageData)

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

请参阅使用HttpWebRequest以multipart/form-data形式POST数据/上传图像的详细信息

并确保使用HTTP嗅探器(例如Fiddler)查看它实际发送了什么。

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

imgBase64 = Convert.ToBase64String(my_image_byte_array)

谢谢回复,我之前尝试过这个方法,但它发布的内容是这样的: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAICAgICAQICAgIDAgIDAwYEAwMDAwcFBQQGCAc (base64)我想要做的是像示例数据一样发布实际的图像数据。 - Chris
如果在Fiddler中看到了base64格式,那么你必须以base64格式发布它。这是图片,只是以不同的格式呈现。在服务器上,它将解码base64格式以保存图像。如果您发布原始数据,它将失败。 - urlreader
目前服务器响应为无效图像,尽管被发布的数据除了实际图像数据以外都是100%正常的,而实际图像数据则处于不同的格式中。 - Chris
是的,回复非常清楚。您发布了错误的数据。原始数据不是基于base64的,所以服务器接受数据,但无法将其转换为有效的图像。这就是为什么会提示“无效图像”。请参见上文的base64转换方法。 - urlreader
我已经修改了代码如下: Dim ImageData() As Byte = File.ReadAllBytes(ImagePath) Dim NewImageData As String = Convert.ToBase64String(ImageData)修改后,数据看起来像这样:/9j/4AAQSkZJR,而Fiddler显示正常上传为:J©õݨe‚Lnž¿Ëã/ǧúÐ5ý¼C。但是,由于这个更改,服务器响应“无效的图像类型”。 - Chris

0

我的“OpenFileDialog”名称是“file”。当单击“按钮”时,将显示一个弹出对话框,用于选择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

文件上传的目标路径将会在创建该文件的父文件夹中的“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);

编程愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接