【问题标题】:Xamarin: Upload image to serverXamarin:将图像上传到服务器
【发布时间】:2017-05-31 06:41:30
【问题描述】:

我需要使用 api 将图像上传到服务器。 现在我正在使用System.Net.Http;

byte[] lFileBytes= DependencyService.Get<IFileHelper>().ReadAllBytes(ImagePath);
ByteArrayContent lFileContent = new ByteArrayContent(lFileBytes,0,lFileBytes.Length);
lFileContent.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse("form-data");
lFileContent.Headers.ContentType=new MediaTypeHeaderValue("image/jpg");
lFileContent.Headers.ContentDisposition.Parameters.Add(new NameValueHeaderValue("name","file"));
lFileContent.Headers.ContentDisposition.Parameters.Add(new NameValueHeaderValue("filename", "9.jpg"));
lFileContent.Headers.ContentLength= lFileBytes.Length;
lContent.Add(lFileContent);

    public byte[] ReadAllBytes(string path) {
                using (var streamReader = new StreamReader(path))
                {
                    using (var memoryStream = new MemoryStream())
                    {
                        streamReader.BaseStream.CopyTo(memoryStream);
                        return memoryStream.ToArray();
                    }
                }
            }

发送请求后出现错误Type file is invalid 我在想byte[] ReadAllBytes(string path) 的问题 对于请求,我可以使用 Stream 或 byte[] 请帮忙 更新

 lRequestResponse = await lHttpClient.PostAsync("URL", lContent);

【问题讨论】:

  • 尝试在MemoryStream 块的第一行设置streamReader.Position = 0。可能是这样的
  • @user1,streamReader 没有 Position 属性,可能是 memoryStream?但它不起作用;
  • 您的上传代码在哪里?你用什么方法?你也有你的服务器方法的样本吗? Fiddler 能用吗?
  • @Rohit 更新上传代码,POST。我没有服务器部分。我使用“邮递员”进行 api 测试。

标签: c# api xamarin xamarin.forms


【解决方案1】:

这对我有帮助

MultipartFormDataContent  lContent=new MultipartFormDataContent();
byte[]  lBytes = DependencyService.Get<IFileHelper>().ReadAllBytes(filename);
ByteArrayContent lFileContent= new ByteArrayContent(lBytes);
lFileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                                            {
                                                FileName = filename,
                                                Name = "imgFile"
                                            };
lFileContent.Headers.ContentType = new MediaTypeHeaderValue("image/png");
lContent.Add(lFileContent);
HttpResponseMessage lRequestResponse=await lHttpClient.PostAsync(await url, lContent);

IOS上的IFileHelper实现

namespace Client.iOS
{
    public class FileHelper : IFileHelper
    {
        private string GetLocalFilePath(string filename)
        {
            string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            string libFolder = Path.Combine(docFolder, "..", "images", "Databases");

            if (!Directory.Exists(libFolder))
            {
                Directory.CreateDirectory(libFolder);
            }

            return Path.Combine(libFolder, filename);
        }
        public byte[] ReadAllBytes(string filename)
        {
            string path=GetLocalFilePath(filename);
            return (FileStream(path) as MemoryStream).ToArray();
        }
        private Stream FileStream(string path)
        {
            StreamReader lStreamReader = new StreamReader(path);
            MemoryStream lMemoryStream = new MemoryStream();
            lMemoryStream.Position = 0;
            lStreamReader.BaseStream.CopyTo(lMemoryStream);
            return lMemoryStream;
        }
    }
}

【讨论】:

    【解决方案2】:

    如果您仍然需要,这对我有用:

    var cont = new MultipartFormDataContent();
    var image = new StreamContent(img.Image.GetStream());
    cont.Add(image, "\"file\"", img.FileName);
    var uri = App.apiurl + $"FileUpload/" + img.FileName + "/";
    using (var client = new HttpClient())
    {
        var response = await client.PostAsync(uri, cont);
        if (response.StatusCode != System.Net.HttpStatusCode.OK)
        {
            // return error code
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 2022-09-26
      • 2018-03-27
      • 2017-06-22
      • 2013-12-17
      • 2014-03-21
      • 2013-11-02
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多