FranGil
FranGil

Reputation: 105

I want to upload files with a C# windows forms project to a webserver

I want to create a C# application using windows forms that let me upload files to a webserver, i have seen a lot of tutorial and everyone of them prove to be useless to solve my problem.

and with my project i have the next code in the button for upload

 WebClient client = new WebClient();
        client.UploadFile("http://localhost:8080/", location);

from here i had have several errors, an try multiple ideas, some of my more common errors are 404 not found or innaccessible path, also sometimes it doenst display me an error and works but the file doesn't save in the indicated path.

some of the links i use to solve the problem are the next ones: http://www.c-sharpcorner.com/UploadFile/scottlysle/UploadwithCSharpWS05032007121259PM/UploadwithCSharpWS.aspx

http://www.c-sharpcorner.com/Blogs/8180/

How to upload a file in window forms?

Upvotes: 3

Views: 18291

Answers (5)

sep7696
sep7696

Reputation: 575

create a simple API Controller file in the Controllers folder and name it UploadController.

Let’s modify that file by adding a new action that will be responsible for the upload logic:

 [HttpPost, DisableRequestSizeLimit]
    public IActionResult UploadFile()
    {
        try
        {
            var file = Request.Form.Files[0];
            string folderName = "Upload";
            string webRootPath = _host.WebRootPath;
            string newPath = Path.Combine(webRootPath, folderName);
            string ext = Path.GetExtension(file.FileName);
            if (!Directory.Exists(newPath))
            {
                Directory.CreateDirectory(newPath);
            }
            if (file.Length > 0)
            {
                string fileName = "";
                string name = Path.GetFileNameWithoutExtension(file.FileName);
                string fullPath = Path.Combine(newPath, name + ext);
                int counter = 2;
                while (System.IO.File.Exists(fullPath))
                {
                    fileName = name + "(" + counter + ")" + ext;
                    fullPath = Path.Combine(newPath, fileName);
                    counter++;
                }
                using (var stream = new FileStream(fullPath, FileMode.Create))
                {
                    file.CopyTo(stream);
                }
                return Ok();
            }
            return Ok();
        }
        catch (System.Exception ex)
        {
            return BadRequest();
        }
    }

We are using a POST action for the upload-related logic and disabling the request size limit as well. and use code below in Winform

 private void Upload(string fileName)
    {
        var client = new WebClient();
        var uri = new Uri("https://localhost/api/upload");
        try
        {
            client.Headers.Add("fileName", System.IO.Path.GetFileName(fileName));
            client.UploadFileAsync(uri, directoryfile);
            client.UploadFileCompleted += Client_UploadFileCompleted;
            
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void Client_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
    {
        MessageBox.Show("done");
    }

Goodluck

Upvotes: 0

A.Bahrami
A.Bahrami

Reputation: 162

you should set in win app

WebClient myWebClient = new WebClient();

string fileName = "File Address";
Console.WriteLine("Uploading {0} to {1} ...",fileName,uriString);

// Upload the file to the URI.
// The 'UploadFile(uriString,fileName)' method implicitly uses HTTP POST method.
byte[] responseArray = myWebClient.UploadFile(uriString,fileName);

then set read and write permission for SubDir

Upvotes: 0

Ali Dehqan
Ali Dehqan

Reputation: 501

In windows:

private void uploadButton_Click(object sender, EventArgs e)
{
    var openFileDialog = new OpenFileDialog();
    var dialogResult = openFileDialog.ShowDialog();    
    if (dialogResult != DialogResult.OK) return;              
    Upload(openFileDialog.FileName);
}

private void Upload(string fileName)
{
    var client = new WebClient();
    var uri = new Uri("http://www.yoursite.com/UploadMethod/");  
    try
    {
        client.Headers.Add("fileName", System.IO.Path.GetFileName(fileName));
        var data = System.IO.File.ReadAllBytes(fileName);
        client.UploadDataAsync(uri, data);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

In server:

[HttpPost]
public async Task<object> UploadMethod()
{
    var file = await Request.Content.ReadAsByteArrayAsync();
    var fileName = Request.Headers.GetValues("fileName").FirstOrDefault();
    var filePath = "/upload/files/";
    try
    {
        File.WriteAllBytes(HttpContext.Current.Server.MapPath(filePath) + fileName, file);           
    }
    catch (Exception ex)
    {
        // ignored
    }

    return null;
}

Upvotes: 1

A.Bahrami
A.Bahrami

Reputation: 162

upload a file to FTP server using C# from our local hard disk.

private void UploadFileToFTP()
{
   FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://www.server.com/sample.txt");

   ftpReq.UseBinary = true;
   ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
   ftpReq.Credentials = new NetworkCredential("user", "pass");

   byte[] b = File.ReadAllBytes(@"E:\sample.txt");
   ftpReq.ContentLength = b.Length;
   using (Stream s = ftpReq.GetRequestStream())
   {
        s.Write(b, 0, b.Length);
   }

   FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse();

   if (ftpResp != null)
   {
         if(ftpResp.StatusDescription.StartsWith("226"))
         {
              Console.WriteLine("File Uploaded.");
         }
   }
}

Upvotes: 2

Damith
Damith

Reputation: 63065

winform

string fullUploadFilePath = @"C:\Users\cc\Desktop\files\test.txt";
string uploadWebUrl = "http://localhost:8080/upload.aspx";
client.UploadFile(uploadWebUrl , fullUploadFilePath );

asp.net create upload.aspx as below

<%@ Import Namespace="System"%>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Net"%>
<%@ Import NameSpace="System.Web"%>

<Script language="C#" runat=server>
void Page_Load(object sender, EventArgs e) {

    foreach(string f in Request.Files.AllKeys) {
        HttpPostedFile file = Request.Files[f];
        file.SaveAs(Server.MapPath("~/Uploads/" + file.FileName));
    }   
}

</Script>
<html>
<body>
<p> Upload complete.  </p>
</body>
</html>

Upvotes: 0

Related Questions