0

我在内存中有一个图像,想将它转换成一个流,这样我就可以 FTP。我已经使用 MemoryStream 和 FtpWebRequest 做到了这一点。但是,结果是无法打开的文件。

一个可行的场景是我第一次将图像保存到物理文件中。然后我使用 FileStream 打开该物理文件并将该流发送给 Ftp。

由于各种原因,我不想先物理保存它 - 是否可以在不保存的情况下执行此操作?

4

3 回答 3

2

如果没有看到您的代码,就很难确定问题所在。当您打开一个新流(即从一个文件)时它会起作用,我最好的猜测是问题与您处理流的方式有关。确保在完成对流的写入后,使用 Seek 方法或 Position 属性将其位置设置回起点。

于 2013-07-08T16:34:32.553 回答
0

您需要发布代码以供任何人更准确地回答。

一般来说,如果输出越来越损坏,您可能需要检查参数,例如

ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;

那么是一篇关于如何做到这一点的精彩文章,

我建议通过首先将正确的图像 ftping 到所需位置进行测试(以测试成功传输),并测试将图像转储到文件的代码(以查看那里是否一切都很好)。

于 2013-07-07T11:34:48.027 回答
0

试试这个:

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");
于 2013-07-07T12:15:57.860 回答