我在内存中有一个图像,想将它转换成一个流,这样我就可以 FTP。我已经使用 MemoryStream 和 FtpWebRequest 做到了这一点。但是,结果是无法打开的文件。
一个可行的场景是我第一次将图像保存到物理文件中。然后我使用 FileStream 打开该物理文件并将该流发送给 Ftp。
由于各种原因,我不想先物理保存它 - 是否可以在不保存的情况下执行此操作?
如果没有看到您的代码,就很难确定问题所在。当您打开一个新流(即从一个文件)时它会起作用,我最好的猜测是问题与您处理流的方式有关。确保在完成对流的写入后,使用 Seek 方法或 Position 属性将其位置设置回起点。
您需要发布代码以供任何人更准确地回答。
一般来说,如果输出越来越损坏,您可能需要检查参数,例如
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
那么这是一篇关于如何做到这一点的精彩文章,
我建议通过首先将正确的图像 ftping 到所需位置进行测试(以测试成功传输),并测试将图像转储到文件的代码(以查看那里是否一切都很好)。
试试这个:
class FTPHelper
{
public FTPHelper(string address, string login, string password)
{
Address = address;
Login = login;
Password = password;
}
public void Upload(MemoryStream stream, string fileName)
{
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Address + @"/" + fileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(Login,Password);
request.UseBinary = true;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
Stream requestStream = request.GetRequestStream();
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);
response.Close();
}
catch (Exception)
{
throw;
}
}
public string Address { get; set; }
public string Login { get; set; }
public string Password { get; set; }
}
类的用法FTPHelper
:
byte[] data;
using (Image image = Image.FromFile(@"C:\test\test.jpg"))
{
using (MemoryStream m = new MemoryStream())
{
image.Save(m, image.RawFormat);
data = m.ToArray();
}
}
FTPHelper ftpHelper = new FTPHelper("ftp://localhost", "test", "test");
ftpHelper.Upload(new MemoryStream(data), "test.jpeg");