使用 HttpClient 上传图片

Posted

技术标签:

【中文标题】使用 HttpClient 上传图片【英文标题】:Upload image using HttpClient 【发布时间】:2015-02-10 01:35:27 【问题描述】:

我想使用 HttpClient 将文件上传到 php 脚本,以将其保存在 Windows Phone 8.1 应用程序的服务器上。

这是我从 this post 获得的 C# 代码。

private async Task<string> GetRawDataFromServer(byte[] data)

    //Debug.WriteLine("byte[] data length:" + Convert.ToBase64String(data).Length);
    var requestContent = new MultipartFormDataContent();
    //    here you can specify boundary if you need---^
    var imageContent = new ByteArrayContent(data);
    imageContent.Headers.ContentType =
        MediaTypeHeaderValue.Parse("image/jpeg");

    requestContent.Add(imageContent, "image", "image.jpg");
    using (var client = new HttpClient())
     

         client.BaseAddress = new Uri("http://www.x.net/");

        var result = client.PostAsync("test/fileupload.php", requestContent).Result;

         return result.Content.ReadAsStringAsync().Result;

     

通过这段代码,我在 php 脚本中检索数据

<?
function base64_to_image( $imageData, $outputfile ) 
    /* encode & write data (binary) */
    $ifp = fopen( $outputfile, "wb" );
    fwrite( $ifp, base64_decode( $imageData ) );
    fclose( $ifp );
    /* return output filename */
    return( $outputfile );
       

if (isset($_POST['image'])) 
    base64_to_jpeg($_POST['image'], "image.jpg");

else
    die("no image data found");
?>

但我总是得到的结果是“找不到数据”,尽管有一个图像文件。将其作为 POST 参数传递是不是我做错了什么?

【问题讨论】:

一方面,不应该将.Result 用于异步方法,而应改为await(编译器应该警告您错误地使用了async)。您是否进行了网络跟踪以查看通过网络发送的内容? 不,说实话我不知道该怎么做,我会查一下。 【参考方案1】:

好吧,经过数小时的研究,我发现我应该从草稿中重新开始。 我使用以下 C# 代码模拟 html 表单上传:

  private async Task<string> UploadImage(StorageFile file)
        
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://your.url.com/");
            MultipartFormDataContent form = new MultipartFormDataContent();
            HttpContent content = new StringContent("fileToUpload");
            form.Add(content, "fileToUpload");
            var stream = await file.OpenStreamForReadAsync();
            content = new StreamContent(stream);
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            
                Name = "fileToUpload",
                FileName = file.Name
            ;
            form.Add(content);
            var response = await client.PostAsync("upload.php", form);
            return response.Content.ReadAsStringAsync().Result;
        

我接收数据的 php 文件如下所示:

<?php 
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['fileToUpload']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) 
    echo "File is valid, and was successfully uploaded.\n";
 else 
    echo "Possible file upload attack!\n";


echo 'Here is some more debugging info:';
print_r($_FILES);
?>

现在它可以正常工作了,我希望有人可以重用我的代码。

【讨论】:

client.BaseAddress = new Uri("your.url.com/") 的your.url.com 和var response = await client.PostAsync("upload.php", form) 的upload.php 有什么区别; ? 如果您的上传脚本位于 your.url.com/upload.php 上,那么您的基本地址是 your.url.com 并且应该发送 POST 的脚本是“upload.php”。 我认为如果你对“内容”使用不同的变量而不是为其他具有兼容类型的东西重新分配 var 会更清楚......

以上是关于使用 HttpClient 上传图片的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient 从 URL 下载图片然后上传图片

httpclient 上传图片

采用HttpClient3.x上传文件 spring 文件上传

WebClient和HttpClient, 以及webapi上传图片

java 怎么根据httpPost 和httpClient 等,传图片到服务器!

必须使用 HttpClient C# 上传带有注册表单数据的图像