Read .csv file from FTP in asp.net [duplicate] - asp.net
I want to read a file from a FTP server without downloading it to a local file. I wrote a function but it does not work:
private string GetServerVersion()
{
WebClient request = new WebClient();
string url = FtpPath + FileName;
string version = "";
request.Credentials = new NetworkCredential(ftp_user, ftp_pas);
try
{
byte[] newFileData = request.DownloadData(new Uri(FtpPath)+FileName);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
}
catch (WebException e)
{
}
return version;
}
Here's a simple working example using your code to grab a file from the Microsoft public FTP servers:
WebClient request = new WebClient();
string url = "ftp://ftp.microsoft.com/developr/fortran/" +"README.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
try
{
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
Console.WriteLine(fileString);
}
catch (WebException e)
{
// Do something such as log error, but this is based on OP's original code
// so for now we do nothing.
}
I reckon you're missing a slash on this line here in your code:
string url = FtpPath + FileName;
Perhaps between FtpPath and FileName ?
Small binary file
If the file is small, the easiest way is using WebClient.DownloadData:
WebClient client = new WebClient();
string url = "ftp://ftp.example.com/remote/path/file.zip";
client.Credentials = new NetworkCredential("username", "password");
byte[] contents = client.DownloadData(url);
Small text file
If the small file is a text file, use WebClient.DownloadString:
string contents = client.DownloadString(url);
It assumes that the file contents is in UTF-8 encoding (a plain ASCII file will do too). If you need to use a different encoding, use WebClient.Encoding property.
Large binary file
If the file is large, so that you need to process it in chunks, instead of loading it to memory whole, use FtpWebRequest:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream stream = request.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[10240];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
// process the chunk in "buffer"
}
}
You can also simplify the code by using WebClient.OpenRead.
Large text file
If the large file is a text file and you want to process it by lines, instead of by chunks of a fixed size, use StreamReader:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.txt");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream stream = request.GetResponse().GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
// process the line
Console.WriteLine(line);
}
}
Again, this assumes UTF-8 encoding. If you want to use another encoding, use an overload of StreamReader constructor that takes also Encoding.
As previously, you can simplify the code by using WebClient.OpenRead.
Stream interface
Though, in many cases, you will want to use the downloaded data in some API that uses the Stream interface. In that case, instead of using any of the solutions above, directly use the stream returned by request.GetResponse().GetResponseStream() or WebClient.OpenRead in the API.
For an example, see Transferring files from FTP directly to Azure Blob storage in C#.
The code you have above is very simillar to another Stackoverlow example I found and used myself 2 days ago. Provided you set the URI, User and Password correctly, it will download the file and set the contents to FileString. I'm not sure what you mean by wanting to read the file without downloading it. This is not really an option.
If you want to look at file attributes (I see you mention "version"), you could use the code below to get all the file Name, Data, and Size from the FTP server without downloading the file.
Call GetFileInfo and pass in the file name (make sure you follow through the code to set the full FTP path, User and Password). This will give you back a FTPFileInfo object with a Name, Date and Size.
public static FTPFileInfo GetFileInfo(string fileName)
{
var dirInfo = WordstockExport.GetFTPDirectoryDetails();
var list = FTPFileInfo.Load(dirInfo);
try
{
FTPFileInfo ftpFile = list.SingleOrDefault(f => f.FileName == fileName);
return ftpFile;
}
catch { }
return null;
}
class FTPFileInfo
{
private DateTime _FileDate;
private long _FileSize;
private string _FileName;
public DateTime FileDate
{
get { return _FileDate; }
set { _FileDate = value; }
}
public long FileSize
{
get { return _FileSize; }
set { _FileSize = value; }
}
public string FileName
{
get { return _FileName; }
set { _FileName = value; }
}
public FTPFileInfo() { }
public static FTPFileInfo LoadFromLine(string line)
{
FTPFileInfo file = new FTPFileInfo();
string[] ftpFileInfo = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
file._FileDate = DateTime.Parse(ftpFileInfo[0] + " " + ftpFileInfo[1]);
file._FileSize = long.Parse(ftpFileInfo[2]);
file._FileName = ftpFileInfo[3];
return file;
}
public static List<FTPFileInfo> Load(string listDirectoryDetails)
{
List<FTPFileInfo> files = new List<FTPFileInfo>();
string[] lines = listDirectoryDetails.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach(var line in lines)
files.Add(LoadFromLine(line));
return files;
}
}
private static string GetFTPDirectoryDetails()
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(App.Export_FTPPath);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials = new NetworkCredential(App.FTP_User, App.FTP_Password);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string fileLines = reader.ReadToEnd();
reader.Close();
response.Close();
return fileLines;
}
It is impossible to know what the issue is without details about the error/exception.
At a guess, you do not seem to be assigning a new value to version after the initial declaration
string version = "";
Try changing your code to
version = System.Text.Encoding.UTF8.GetString(newFileData);
C Sharp GUI app. Minimal ftp transfer, not elegant but it works fine.
GUI, not console.
Weather from noaa. Find your region (look for your metar)!
A METAR weather report is predominantly used by pilots in fulfillment of a part of a pre- flight
Build with vs 2012 premium RC (july 2012)
(click on label, not button)
using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Collections.Generic;
namespace getweather
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void CYYY_Click(object sender, EventArgs e)
{
WebClient request = new WebClient();
string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYYY.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
richTextBox1.Text = fileString;
}
private void CYSC_Click(object sender, EventArgs e)
{
WebClient request = new WebClient();
string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYSC.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
richTextBox1.Text = fileString;
}
private void CYQB_Click(object sender, EventArgs e)
{
WebClient request = new WebClient();
string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYQB.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
richTextBox1.Text = fileString;
}
private void CYUY_Click(object sender, EventArgs e)
{
WebClient request = new WebClient();
string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYUY.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
richTextBox1.Text = fileString;
}
private void CYHU_Click(object sender, EventArgs e)
{
WebClient request = new WebClient();
string url = "ftp://tgftp.nws.noaa.gov/data/observations/metar/decoded/CYHU.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
richTextBox1.Text = fileString;
}
}
}
WebClient request = new WebClient();
string url = "ftp://ftp.microsoft.com/developr/fortran/" +"README.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous#example.com");
request.Proxy = null;
try
{
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
Console.WriteLine(fileString);
}
catch (WebException e)
{
// Do something such as log error, but this is based on OP's original code
// so for now we do nothing.
}
I know this is an old question, but I thought I'd suggest using path.combine for the next guy reading this. Helps clean up these kinds of issues.
string url = Path.Combine("ftp://ftp.microsoft.com/developr/fortran", "README.TXT");
We can use below method to get the file attribute from ftp without downloading the file.This is working fine for me.
public DataTable getFileListFTP(string serverIP,string userID,string Password)
{
DataTable dt = new DataTable();
string[] fileListArr;
string fileName = string.Empty;
long fileSize = 0;
// DateTime creationDate;
string creationDate;
FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(serverIP);
Request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
Request.Credentials = new NetworkCredential(userID,Password);
FtpWebResponse Response = (FtpWebResponse)Request.GetResponse();
Stream ResponseStream = Response.GetResponseStream();
StreamReader Reader = new StreamReader(ResponseStream);
dt.Columns.Add("FileName", typeof(String));
dt.Columns.Add("FileSize", typeof(String));
dt.Columns.Add("CreationDate", typeof(DateTime));
//CultureInfo c = new CultureInfo("ES-ES");
while (!Reader.EndOfStream)//Read file name
{
fileListArr = Convert.ToString(Reader.ReadLine()).Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
fileSize = long.Parse(fileListArr[4]);
creationDate = fileListArr[6] + " " + fileListArr[5] + " " + fileListArr[7];
//creationDate =Convert.ToDateTime(fileListArr[6] + " " + fileListArr[5] + " " + fileListArr[7], c).ToString("dd/MMM/yyyy", DateTimeFormatInfo.InvariantInfo);
fileName = Convert.ToString(fileListArr[8]);
DataRow drow = dt.NewRow();
drow["FileName"] = fileName;
drow["FileSize"] = fileName;
drow["CreationDate"] = creationDate;
dt.Rows.Add(drow);
}
Response.Close();
ResponseStream.Close();
Reader.Close();
return dt;
}
Take a look at my FTP class, it might be exactly what you need.
Public Class FTP
'-------------------------[BroCode]--------------------------
'----------------------------FTP-----------------------------
Private _credentials As System.Net.NetworkCredential
Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
setCredentials(_FTPUser, _FTPPass)
End Sub
Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String)
Dim _FileInfo As New System.IO.FileInfo(_FileName)
Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)
_FtpWebRequest.Credentials = _credentials
_FtpWebRequest.KeepAlive = False
_FtpWebRequest.Timeout = 20000
_FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
_FtpWebRequest.UseBinary = True
_FtpWebRequest.ContentLength = _FileInfo.Length
Dim buffLength As Integer = 2048
Dim buff(buffLength - 1) As Byte
Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()
Try
Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()
Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)
Do While contentLen <> 0
_Stream.Write(buff, 0, contentLen)
contentLen = _FileStream.Read(buff, 0, buffLength)
Loop
_Stream.Close()
_Stream.Dispose()
_FileStream.Close()
_FileStream.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
Try
Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
_request.KeepAlive = False
_request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
_request.Credentials = _credentials
Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
Dim responseStream As System.IO.Stream = _response.GetResponseStream()
Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
responseStream.CopyTo(fs)
responseStream.Close()
_response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
Dim ret As New List(Of String)
Try
Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
_request.KeepAlive = False
_request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
_request.Credentials = _credentials
Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
Dim responseStream As System.IO.Stream = _response.GetResponseStream()
Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
Dim FileData As String = _reader.ReadToEnd
Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
For Each l As String In Lines
ret.Add(l)
Next
_reader.Close()
_response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Return ret
End Function
Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
_credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
End Sub
End Class
To initialize:
Dim ftp As New FORM.FTP("username", "password")
ftp.UploadFile("c:\file.jpeg", "ftp://domain/file.jpeg")
ftp.DownloadFile("c:\file.jpeg", "ftp://ftp://domain/file.jpeg")
Dim directory As List(Of String) = ftp.GetDirectory("ftp://ftp.domain.net/")
ListBox1.Items.Clear()
For Each item As String In directory
ListBox1.Items.Add(item)
Next
https://stackoverflow.com/a/28669746/2701974
Related
Odata naming file return error message of the
I have this custom Odata function to download pdf from download pdf database. I have some issues 1.with Pdf name does not name "reportname.pdf" it is named response.pdf as 2.return error message of reportBinary is null [HttpGet] [ODataRoute("GetDownloadReport(downloadId={downloadId})")] public HttpResponseMessage GetDownloadReport(Guid downloadId) var received = DateTime.UtcNow; byte[] reportBinary = null; string queryString = "SELECT report FROM downloads WHERE id = #downloadId "; bool success = false; using (SqlConnection conn = new SqlConnection(connectionString)) { //get the binary from database } HttpResponseMessage response = null; try { if (reportBinary == null) return Request.CreateResponse(HttpStatusCode.Gone); response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new ByteArrayContent(reportBinary); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "PORTName.pdf" }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); return response; } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.Gone); } }
try to set filename manually: String headerInfo = "attachment; filename=" + System.Web.HttpUtility.UrlPathEncode("PORTName.pdf"); response.Content.Headers.Add("Content-Disposition", headerInfo); I'm not sure what do you want to do about error message, but if you mean setting string content, just set it ;) response = Request.CreateResponse(HttpStatusCode.Gone); response.Content = new StringContent(...); return response; Consider using NotFound instead of Gone status code (Gone has very specific meaning).
files not uploading to FTP Server [duplicate]
I try upload a file to an FTP-server with C#. The file is uploaded but with zero bytes. private void button2_Click(object sender, EventArgs e) { var dirPath = #"C:/Documents and Settings/sander.GD/Bureaublad/test/"; ftp ftpClient = new ftp("ftp://example.com/", "username", "password"); string[] files = Directory.GetFiles(dirPath,"*.*"); var uploadPath = "/httpdocs/album"; foreach (string file in files) { ftpClient.createDirectory("/test"); ftpClient.upload(uploadPath + "/" + Path.GetFileName(file), file); } if (string.IsNullOrEmpty(txtnaam.Text)) { MessageBox.Show("Gelieve uw naam in te geven !"); } }
The existing answers are valid, but why re-invent the wheel and bother with lower level WebRequest types while WebClient already implements FTP uploading neatly: using (var client = new WebClient()) { client.Credentials = new NetworkCredential(ftpUsername, ftpPassword); client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile); }
Easiest way The most trivial way to upload a file to an FTP server using .NET framework is using WebClient.UploadFile method: WebClient client = new WebClient(); client.Credentials = new NetworkCredential("username", "password"); var url = "ftp://ftp.example.com/remote/path/file.zip"; client.UploadFile(url, #"C:\local\path\file.zip"); Advanced options If you need a greater control, that WebClient does not offer (like TLS/SSL encryption, ascii/text transfer mode, active mode, transfer resuming, progress monitoring, etc), use FtpWebRequest. Easy way is to just copy a FileStream to an FTP stream using Stream.CopyTo: var url = "ftp://ftp.example.com/remote/path/file.zip"; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(#"C:\local\path\file.zip")) using (Stream ftpStream = request.GetRequestStream()) { fileStream.CopyTo(ftpStream); } Progress monitoring If you need to monitor an upload progress, you have to copy the contents by chunks yourself: var url = "ftp://ftp.example.com/remote/path/file.zip"; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url); request.Credentials = new NetworkCredential("username", "password"); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(#"C:\local\path\file.zip")) using (Stream ftpStream = request.GetRequestStream()) { byte[] buffer = new byte[10240]; int read; while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0) { ftpStream.Write(buffer, 0, read); Console.WriteLine("Uploaded {0} bytes", fileStream.Position); } } For GUI progress (WinForms ProgressBar), see C# example at: How can we show progress bar for upload with FtpWebRequest Uploading folder If you want to upload all files from a folder, see Upload directory of files to FTP server using WebClient. For a recursive upload, see Recursive upload to FTP server in C#
.NET 5 Guide async Task<FtpStatusCode> FtpFileUploadAsync(string ftpUrl, string userName, string password, string filePath) { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential(userName, password); using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) using (Stream requestStream = request.GetRequestStream()) { await fileStream.CopyToAsync(requestStream); } using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync()) { return response.StatusCode; } } .NET Framework public void UploadFtpFile(string folderName, string fileName) { FtpWebRequest request; string folderName; string fileName; string absoluteFileName = Path.GetFileName(fileName); request = WebRequest.Create(new Uri(string.Format(#"ftp://{0}/{1}/{2}", "127.0.0.1", folderName, absoluteFileName))) as FtpWebRequest; request.Method = WebRequestMethods.Ftp.UploadFile; request.UseBinary = 1; request.UsePassive = 1; request.KeepAlive = 1; request.Credentials = new NetworkCredential(user, pass); request.ConnectionGroupName = "group"; using (FileStream fs = File.OpenRead(fileName)) { byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); Stream requestStream = request.GetRequestStream(); requestStream.Write(buffer, 0, buffer.Length); requestStream.Flush(); requestStream.Close(); } } How to use UploadFtpFile("testFolder", "E:\\filesToUpload\\test.img"); use this in your foreach and you only need to create folder one time to create a folder request = WebRequest.Create(new Uri(string.Format(#"ftp://{0}/{1}/", "127.0.0.1", "testFolder"))) as FtpWebRequest; request.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse ftpResponse = (FtpWebResponse)request.GetResponse();
The following works for me: public virtual void Send(string fileName, byte[] file) { ByteArrayToFile(fileName, file); var request = (FtpWebRequest) WebRequest.Create(new Uri(ServerUrl + fileName)); request.Method = WebRequestMethods.Ftp.UploadFile; request.UsePassive = false; request.Credentials = new NetworkCredential(UserName, Password); request.ContentLength = file.Length; var requestStream = request.GetRequestStream(); requestStream.Write(file, 0, file.Length); requestStream.Close(); var response = (FtpWebResponse) request.GetResponse(); if (response != null) response.Close(); } You can't read send the file parameter in your code as it is only the filename. Use the following: byte[] bytes = File.ReadAllBytes(dir + file); To get the file so you can pass it to the Send method.
public static void UploadFileToFtp(string url, string filePath, string username, string password) { var fileName = Path.GetFileName(filePath); var request = (FtpWebRequest)WebRequest.Create(url + fileName); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential(username, password); request.UsePassive = true; request.UseBinary = true; request.KeepAlive = false; using (var fileStream = File.OpenRead(filePath)) { using (var requestStream = request.GetRequestStream()) { fileStream.CopyTo(requestStream); requestStream.Close(); } } var response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("Upload done: {0}", response.StatusDescription); response.Close(); }
In the first example must change those to: requestStream.Flush(); requestStream.Close(); First flush and after that close.
This works for me,this method will SFTP a file to a location within your network. It uses SSH.NET.2013.4.7 library.One can just download it for free. //Secure FTP public void SecureFTPUploadFile(string destinationHost,int port,string username,string password,string source,string destination) { ConnectionInfo ConnNfo = new ConnectionInfo(destinationHost, port, username, new PasswordAuthenticationMethod(username, password)); var temp = destination.Split('/'); string destinationFileName = temp[temp.Count() - 1]; string parentDirectory = destination.Remove(destination.Length - (destinationFileName.Length + 1), destinationFileName.Length + 1); using (var sshclient = new SshClient(ConnNfo)) { sshclient.Connect(); using (var cmd = sshclient.CreateCommand("mkdir -p " + parentDirectory + " && chmod +rw " + parentDirectory)) { cmd.Execute(); } sshclient.Disconnect(); } using (var sftp = new SftpClient(ConnNfo)) { sftp.Connect(); sftp.ChangeDirectory(parentDirectory); using (var uplfileStream = System.IO.File.OpenRead(source)) { sftp.UploadFile(uplfileStream, destinationFileName, true); } sftp.Disconnect(); } }
publish date: 06/26/2018 https://learn.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp using System; using System.IO; using System.Net; using System.Text; namespace Examples.System.Net { public class WebRequestGetExample { public static void Main () { // Get the object used to communicate with the server. FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm"); request.Method = WebRequestMethods.Ftp.UploadFile; // This example assumes the FTP site uses anonymous logon. request.Credentials = new NetworkCredential("anonymous", "janeDoe#contoso.com"); // Copy the contents of the file to the request stream. byte[] fileContents; using (StreamReader sourceStream = new StreamReader("testfile.txt")) { fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); } request.ContentLength = fileContents.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(fileContents, 0, fileContents.Length); } using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { Console.WriteLine($"Upload File Complete, status {response.StatusDescription}"); } } } }
Best way I've found is FluentFtp You can find the repo here: https://github.com/robinrodricks/FluentFTP and the quickstart example here: https://github.com/robinrodricks/FluentFTP/wiki/Quick-Start-Example. And actually the WebRequest class recommended by a few people here, is not recommended by Microsoft anymore, check out this page: https://learn.microsoft.com/en-us/dotnet/api/system.net.webrequest?view=net-5.0 // create an FTP client and specify the host, username and password // (delete the credentials to use the "anonymous" account) FtpClient client = new FtpClient("123.123.123.123", "david", "pass123"); // connect to the server and automatically detect working FTP settings client.AutoConnect(); // upload a file and retry 3 times before giving up client.RetryAttempts = 3; client.UploadFile(#"C:\MyVideo.mp4", "/htdocs/big.txt", FtpRemoteExists.Overwrite, false, FtpVerify.Retry); // disconnect! good bye! client.Disconnect();
I have observed that - FtpwebRequest is missing. As the target is FTP, so the NetworkCredential required. I have prepared a method that works like this, you can replace the value of the variable ftpurl with the parameter TargetDestinationPath. I had tested this method on winforms application : private void UploadProfileImage(string TargetFileName, string TargetDestinationPath, string FiletoUpload) { //Get the Image Destination path string imageName = TargetFileName; //you can comment this string imgPath = TargetDestinationPath; string ftpurl = "ftp://downloads.abc.com/downloads.abc.com/MobileApps/SystemImages/ProfileImages/" + imgPath; string ftpusername = krayknot_DAL.clsGlobal.FTPUsername; string ftppassword = krayknot_DAL.clsGlobal.FTPPassword; string fileurl = FiletoUpload; FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl); ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword); ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftpClient.UseBinary = true; ftpClient.KeepAlive = true; System.IO.FileInfo fi = new System.IO.FileInfo(fileurl); ftpClient.ContentLength = fi.Length; byte[] buffer = new byte[4097]; int bytes = 0; int total_bytes = (int)fi.Length; System.IO.FileStream fs = fi.OpenRead(); System.IO.Stream rs = ftpClient.GetRequestStream(); while (total_bytes > 0) { bytes = fs.Read(buffer, 0, buffer.Length); rs.Write(buffer, 0, bytes); total_bytes = total_bytes - bytes; } //fs.Flush(); fs.Close(); rs.Close(); FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse(); string value = uploadResponse.StatusDescription; uploadResponse.Close(); } Let me know in case of any issue, or here is one more link that can help you: https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx
asp.net: upload images to SQL using imageupload
i have a database column 'images' which can hold binary data, for some reason the images doesnt want to upload. it doest pull any exceptions or aything wrong with the code: here is extracts of the code protected void BtnAdd_Click(object sender, EventArgs e) { string imgpath = FileUploadImage.FileName.ToString(); DBConnectivity.Add(imgpath); } here is the DBCoectivity Class: public static void Add(string imgpath) { byte[] imgbt = null; FileStream fstream = new FileStream(imgpath, FileMode.Open, FileAccess.Read); BinaryReader BR = new BinaryReader(fstream); imgbt = BR.ReadBytes((int)fstream.Length); SqlConnection myConnection = GetConnection(); string myQuery = "INSERT INTO images( imagePath) VALUES ( #IMG )"; SqlCommand myCommand = new SqlCommand(myQuery, myConnection); try { myConnection.Open(); myCommand.Parameters.Add(new SqlParameter("#IMG",imgbt)); myCommand.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine("Exception in DBHandler", ex); } finally { myConnection.Close(); } }
This snippet works for me: byte[] imgbt = null; if (FileUploadImage.HasFile) { Stream photoStream = FileUploadImage.PostedFile.InputStream; imgbt = new byte[FileUploadImage.PostedFile.ContentLength]; photoStream.Read(imgbt, 0, FileUploadImage.PostedFile.ContentLength); } Also, you were inserting the image name (misspelled as parameter to Add method and bad choice of variable name as it is not a path) into the database, not the binary data. It should read: string myQuery = "INSERT INTO images(imgbt) VALUES (#IMG)"; Here's a sample tutorial which explains it better: File Upload with ASP.NET
saving a pdf to a sql database using itextsharp
I'm using this tutorial https://web.archive.org/web/20211020001747/https://www.4guysfromrolla.com/articles/030211-1.aspx that’s uses a PDF template, lets the user input fields using textbox's. The file downloads onto the client’s pc but I would like to save a copy of the file into a sql database also or just save the file in the database instead of both. protected void btnGeneratePDF_Click(object sender, EventArgs e) { var pdfPath = Path.Combine(Server.MapPath("~/PDFTemplates/fw9.pdf")); // Get the form fields for this PDF and fill them in! var formFieldMap = PDFHelper.GetFormFieldNames(pdfPath); formFieldMap["topmostSubform[0].Page1[0].f1_01_0_[0]"] = txtName.Text; formFieldMap["topmostSubform[0].Page1[0].f1_02_0_[0]"] = txtBusinessName.Text; if (rblTaxClassification.SelectedValue != null) { var formFieldName = string.Format("topmostSubform[0].Page1[0].c1_01[{0}]", rblTaxClassification.SelectedIndex); formFieldMap[formFieldName] = (rblTaxClassification.SelectedIndex + 1).ToString(); } if (chkExemptPayee.Checked) formFieldMap["topmostSubform[0].Page1[0].c1_01[7]"] = "8"; formFieldMap["topmostSubform[0].Page1[0].f1_04_0_[0]"] = txtAddress.Text; formFieldMap["topmostSubform[0].Page1[0].f1_05_0_[0]"] = txtCityStateZIP.Text; formFieldMap["topmostSubform[0].Page1[0].f1_07_0_[0]"] = txtAccountNumbers.Text; // Requester's name and address (hard-coded) formFieldMap["topmostSubform[0].Page1[0].f1_06_0_[0]"] = "Acme Website\n123 Anywhere Lane\nSpringfield, USA"; // SSN if (!string.IsNullOrEmpty(txtSSN1.Text)) { formFieldMap["topmostSubform[0].Page1[0].social[0].TextField1[0]"] = txtSSN1.Text; formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[0]"] = txtSSN2.Text; formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[1]"] = txtSSN3.Text; } else if (!string.IsNullOrEmpty(txtEIN1.Text)) { formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[2]"] = txtEIN1.Text; formFieldMap["topmostSubform[0].Page1[0].social[0].TextField2[3]"] = txtEIN2.Text; } var pdfContents = PDFHelper.GeneratePDF(pdfPath, formFieldMap); PDFHelper.ReturnPDF(pdfContents, "Completed-W9.pdf"); FileStream fs = new FileStream(pdfPath, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); Byte[] bytes = br.ReadBytes((Int32)fs.Length); br.Close(); fs.Close(); //insert the file into database string strQuery = "insert into tblFiles(Name, ContentType, Data) values (#Name, #ContentType, #Data)"; SqlCommand cmd = new SqlCommand(strQuery); cmd.Parameters.Add("#Name", SqlDbType.VarChar).Value = "Completed-W9132.pdf"; cmd.Parameters.Add("#ContentType", SqlDbType.VarChar).Value = "application/pdf"; cmd.Parameters.Add("#Data", SqlDbType.Binary).Value = bytes; InsertUpdateData(cmd); App_code/pdfHelper.cs using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Web; using System.IO; using iTextSharp.text.pdf; using System.Data; using System.Data.SqlClient; using System.Configuration; public class PDFHelper { public static Dictionary<string, string> GetFormFieldNames(string pdfPath) { var fields = new Dictionary<string, string>(); var reader = new PdfReader(pdfPath); foreach (DictionaryEntry entry in reader.AcroFields.Fields) fields.Add(entry.Key.ToString(), string.Empty); reader.Close(); return fields; } public static byte[] GeneratePDF(string pdfPath, Dictionary<string, string> formFieldMap) { var output = new MemoryStream(); var reader = new PdfReader(pdfPath); var stamper = new PdfStamper(reader, output); var formFields = stamper.AcroFields; foreach (var fieldName in formFieldMap.Keys) formFields.SetField(fieldName, formFieldMap[fieldName]); stamper.FormFlattening = true; stamper.Close(); reader.Close(); return output.ToArray(); } // See http://stackoverflow.com/questions/4491156/get-the-export-value-of-a-checkbox-using-itextsharp/ public static string GetExportValue(AcroFields.Item item) { var valueDict = item.GetValue(0); var appearanceDict = valueDict.GetAsDict(PdfName.AP); if (appearanceDict != null) { var normalAppearances = appearanceDict.GetAsDict(PdfName.N); // /D is for the "down" appearances. // if there are normal appearances, one key will be "Off", and the other // will be the export value... there should only be two. if (normalAppearances != null) { foreach (var curKey in normalAppearances.Keys) if (!PdfName.OFF.Equals(curKey)) return curKey.ToString().Substring(1); // string will have a leading '/' character, so remove it! } } // if that doesn't work, there might be an /AS key, whose value is a name with // the export value, again with a leading '/', so remove it! var curVal = valueDict.GetAsName(PdfName.AS); if (curVal != null) return curVal.ToString().Substring(1); else return string.Empty; } public static void ReturnPDF(byte[] contents) { ReturnPDF(contents, null); } public static void ReturnPDF(byte[] contents, string attachmentFilename) { var response = HttpContext.Current.Response; if (!string.IsNullOrEmpty(attachmentFilename)) response.AddHeader("Content-Disposition", "attachment; filename=" + attachmentFilename); response.ContentType = "application/pdf"; response.BinaryWrite(contents); response.End(); } }
The parts of the tutorial you're looking for in that case are right here: Response.ContentType = "application/pdf"; Response.BinaryWrite(output.ToArray()); When saving a "file" to a database you essentially care about two (maybe three) things: The byte array of the file contents The type of the file (Maybe a name for the file) Since the tutorial concludes with two of these things (above), the type and the data, you can store these two things into your database however you need to store them. This depends on the database you're using, how you access that database, etc. Essentially to store these two things you just need a text column (varchar?) and a binary (or "blob") column (varbinary?). The only difference is that instead of setting the type as a header in an HTTP response and writing the bytes to that HTTP response, you're using both of them as values in your database. Everything else is the same.
ASP .NET Dataset to XML: Storage and Reading
[Below is the almost full Code modified. Currently shows illegal character error when being read]. I have a C# ASP.NET application which is currently reading an XML file from the file system and then loading it into a GridView control. In the grid I can Delete rows. There is also an file upload button below the grid which upload PDF files and they show up in the grid. My code is basically a modified version of this code The next stage of my work involves reading the XML data as String from a database field--instead of from the XML file. For that to happen, I think I can start out by just reading from the XML file, making changes in the aspx page, and the writing the 'dataset' into a database field called 'PDF_Storage'. How can I do that. Crucially, I need to be able to convert the dataset into some kind of string format for storage. Here is my code snippet. My database is Oracle 10 but I can figure out the Update sql syntax. SAMPLE XML FILE: <DataSet> <PDF> <pdf>MyPDF1.pdf</pdf> </PDF> <PDF> <pdf>MyPDF2.pdf</pdf> </PDF> <PDF> <pdf>MyPDF3.pdf</pdf> </PDF> </DataSet> And the corresponding code: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using Oracle.DataAccess.Client; using System.Web.Configuration; using System.IO; using System.Xml; using System.Text.RegularExpressions; public partial class XMLGridTest : System.Web.UI.Page { public static string GetConnString() { return WebConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { binddata(); } } void binddata() { DataSet ds = new DataSet(); // ds.ReadXml(Server.MapPath("testxml.xml")); String strConnect = GetConnString(); OracleConnection oracleConn = new OracleConnection(); oracleConn.ConnectionString = strConnect; oracleConn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = oracleConn; cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT PDF_Storage FROM CampusDev.CU_POLY WHERE OBJECTID = " + Request.QueryString["OBJECTID"]; OracleDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { if (!reader.IsDBNull(0)) { //## Line Below as the 'illegal characters' problem### ds.ReadXml(reader[0].ToString(), XmlReadMode.IgnoreSchema); gv.DataSource = ds; gv.DataBind(); } else { // Response.Write(reader.GetString(1)); // TextBox1.Text = reader.GetString(1); } } // gv.DataSource = ds;//##Hard coded for XML. Works! // gv.DataBind(); //Finally, close the connection oracleConn.Close(); } protected void Canceldata(object s, GridViewCancelEditEventArgs e) { gv.EditIndex = -1; binddata(); } protected void pageddata(object s, GridViewPageEventArgs e) { gv.PageIndex = e.NewPageIndex; binddata(); } protected void insert(object sender, EventArgs e) { /////////////////////////////////File Upload Code///////////////////////////////// // Initialize variables string sSavePath = "ParcelPDF/"; ; if (fileupload.PostedFile == null) { Label1.Text = "Must Upload a PDF file!"; return; } HttpPostedFile myFile = fileupload.PostedFile; int nFileLen = myFile.ContentLength; // Check file extension (must be JPG) if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".pdf") { Label1.Text = "The file must have an extension of .pdf"; return; } // Read file into a data stream byte[] myData = new Byte[nFileLen]; myFile.InputStream.Read(myData, 0, nFileLen); // Make sure a duplicate file doesn’t exist. If it does, keep on appending an incremental numeric until it is unique string sFilename = System.IO.Path.GetFileName(myFile.FileName); int file_append = 0; while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename))) { file_append++; sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) + file_append.ToString() + ".pdf"; } // Save the stream to disk System.IO.FileStream newFile = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename), System.IO.FileMode.Create); newFile.Write(myData, 0, myData.Length); newFile.Close(); binddata(); DataSet ds = gv.DataSource as DataSet; DataRow dr = ds.Tables[0].NewRow(); // dr[0] = pdf.Text; dr[0] = sFilename.ToString(); ds.Tables[0].Rows.Add(dr); ds.AcceptChanges(); string blah = "blah"; Response.Write(ds.Tables.ToString()); // ds.WriteXml(Server.MapPath("testxml.xml")); String strConnect = GetConnString(); OracleConnection oracleConn = new OracleConnection(); oracleConn.ConnectionString = strConnect; oracleConn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = oracleConn; cmd.CommandType = CommandType.Text; // cmd.CommandText = "SELECT OBJECTID,COMMENTS FROM CampusDev.CU_POLY WHERE OBJECTID = " + Request.QueryString["OBJECTID"]; cmd.CommandText = "UPDATE CampusDev.CU_POLY SET PDF_Storage = :PDF_Storage WHERE OBJECTID = " + Request.QueryString["OBJECTID"]; StringWriter SW = new StringWriter(); ds.WriteXml(SW); cmd.Parameters.Add(":PDF_Storage", SW.ToString()); cmd.ExecuteNonQuery(); oracleConn.Close(); binddata(); } protected void Deletedata(object s, GridViewDeleteEventArgs e) { binddata(); DataSet ds = gv.DataSource as DataSet; ds.Tables[0].Rows[gv.Rows[e.RowIndex].DataItemIndex].Delete(); // ds.WriteXml(Server.MapPath("testxml.xml"));//Disabled now. Do database. Irfan. 07/09/10 String strConnect = GetConnString(); OracleConnection oracleConn = new OracleConnection(); oracleConn.ConnectionString = strConnect; oracleConn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = oracleConn; cmd.CommandType = CommandType.Text; cmd.CommandText = "UPDATE CampusDev.CU_POLY SET PDF_Storage = :PDF_Storage WHERE OBJECTID = " + Request.QueryString["OBJECTID"]; StringWriter SW = new StringWriter(); ds.WriteXml(SW,XmlWriteMode.IgnoreSchema); Regex regex = new Regex(#"(\r\n|\r|\n)+"); string newText = regex.Replace(SW.ToString(), ""); cmd.Parameters.Add(":PDF_Storage", newText); cmd.ExecuteNonQuery(); oracleConn.Close(); binddata(); string blah = "blah"; }
Here is how I have done this in the past. For the insert you can basically just write the dataset's xml representation out to a string and save it directly to a field in the database. In this case I leveraged Sql Server 2008 and an XML datatype for the database field. I think the datatype in Oracle is XMLTYPE. Insert: public static void InsertDataSet(string key, DataSet dataSet) { string xml = string.Empty; using (MemoryStream ms = new MemoryStream()) { dataSet.WriteXml(ms, XmlWriteMode.WriteSchema); ms.Position = 0; using (StreamReader sr = new StreamReader(ms)) { xml = sr.ReadToEnd(); } using (SqlServerConnection c = new SqlServerConnection(connectionString)) { c.command.CommandType = CommandType.StoredProcedure; c.command.CommandText = "some stored procedure to do the insert"; c.command.Parameters.Clear(); c.command.Parameters.Add(new SqlParameter("#key", key)); c.command.Parameters.Add(new SqlParameter("#xml", xml)); c.command.ExecuteNonQuery(); } } } Getting the dataset back out of the database is as simple as reading the xml data from the database back into a TextReader and then building a new DataSet. Get: public static DataSet GetDataSet(string key) { using (SqlServerConnection c = new SqlServerConnection(connectionString)) { c.command.CommandType = CommandType.StoredProcedure; c.command.CommandText = "some stored procedure to get the xml"; c.command.Parameters.Clear(); c.command.Parameters.Add(new SqlParameter("#key", key)); dr = c.command.ExecuteReader(); if (dr == null) { return null; } if (dr.HasRows) { while (dr.Read()) { if (dr["xml_field"] != DBNull.Value) { TextReader tr = new StringReader(dr["xml_field"].ToString()); result = new DataSet(); result.ReadXml(tr, XmlReadMode.ReadSchema); } } } } return result; } Hope this helps. Enjoy!