Forum Xamarin.Forms

File upload progress bar Xamarin

guizmoguizmo Member ✭✭

Hello according to : https://gist.github.com/HirbodBehnam/272aa5e4b82c2fb05583d095f2224861

I implemented this :

My call :smile:

`public async Task UploadFiles(FileInfo fileInfo)
{
string res = null;

    using (var client = new HttpClient())
    using (var multiForm = new MultipartFormDataContent())
    {
        client.Timeout = TimeSpan.FromMinutes(5); // You may need this if you are uploading a big file

        var file = new ProgressableStreamContent(new StreamContent(File.OpenRead(fileInfo.FullName))
            , (sent, total) => {
                //Console.SetCursorPosition(1, 0); // Remove last line
                Console.WriteLine("\bUploading " + ((float)sent / total) * 100f);
            });

        multiForm.Add(file, fileInfo.Name, fileInfo.Name); // Add the file

        var uploadServiceBaseAdress = "http://10.0.2.2:44560/PostFiles/";

        var response = await client.PostAsync(uploadServiceBaseAdress, multiForm);
        Console.WriteLine(response.StatusCode);
        if (response.StatusCode == HttpStatusCode.OK)
        {
            res = await response.Content.ReadAsStringAsync();
            Console.WriteLine(res);

        }

        return res;
    }`

My class : Progressable stream content

`internal class ProgressableStreamContent:HttpContent
{
///


/// Lets keep buffer of 20kb
///

private const int defaultBufferSize = 5 * 4096;

private HttpContent content;
private int bufferSize;
//private bool contentConsumed;
private Action<long, long> progress;

public ProgressableStreamContent(HttpContent content, Action<long, long> progress) : this(content, defaultBufferSize, progress) { }

public ProgressableStreamContent(HttpContent content, int bufferSize, Action<long, long> progress)
{
    if (content == null)
    {
        throw new ArgumentNullException("content");
    }
    if (bufferSize <= 0)
    {
        throw new ArgumentOutOfRangeException("bufferSize");
    }

    this.content = content;
    this.bufferSize = bufferSize;
    this.progress = progress;

    foreach (var h in content.Headers)
    {
        this.Headers.Add(h.Key, h.Value);
    }
}

protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{

    return Task.Run(async () =>
    {
        var buffer = new Byte[this.bufferSize];
        long size;
        TryComputeLength(out size);
        var uploaded = 0;


        using (var sinput = await content.ReadAsStreamAsync())
        {
            while (true)
            {
                var length = sinput.Read(buffer, 0, buffer.Length);
                if (length <= 0) break;

                //downloader.Uploaded = uploaded += length;
                uploaded += length;
                progress?.Invoke(uploaded, size);

                //System.Diagnostics.Debug.WriteLine($"Bytes sent {uploaded} of {size}");

                stream.Write(buffer, 0, length);
                stream.Flush();
            }
        }
        stream.Flush();
    });
}

protected override bool TryComputeLength(out long length)
{
    length = content.Headers.ContentLength.GetValueOrDefault();
    return true;
}

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        content.Dispose();
    }
    base.Dispose(disposing);
}

}`

It bind in the constructor of ProgressableStreamContent. Then going back to my upload file method but when it come to return it crash : Operation not supported on this platform.

I think there is something that I dont understand and I didn't found any docs related to this. So could you explain me whats wrong ?

Sign In or Register to comment.