图片上传到FTP问题

本文关键字:FTP 问题 | 更新日期: 2023-09-27 18:09:19

我使用以下代码上传图像到我的FTP服务器,但我有一个问题。如果我在上传之前使用代码来检查图像的尺寸(高度和宽度),那么在FTP服务器中创建。png文件,但它是空的(或无效的格式),如果我删除代码来检查尺寸,那么图像被正确上传。有人对此有什么想法吗?

    public ActionResult UploadFile(int type, HttpPostedFileBase imagefile)
    {
        //check image height and width
        using (System.Drawing.Image image = System.Drawing.Image.FromStream(imagefile.InputStream, true, true))
        {
            if (image.Width > 160 || image.Height > 160)
            {
                //do something here
            }
        }//end check image height and width
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftpPath" + "/" + imagefile.FileName);
        request.Credentials = new NetworkCredential("ftpUserName", "ftpPassword");
        request.Method = WebRequestMethods.Ftp.UploadFile;
        var sourceStream = imagefile.InputStream;
        Stream requestStream = request.GetRequestStream();
        request.ContentLength = sourceStream.Length;
        int BUFFER_SIZE = imagefile.ContentLength;
        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE);
        do
        {
            requestStream.Write(buffer, 0, bytesRead);
            bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE);
        } while (bytesRead > 0);
        sourceStream.Close();
        requestStream.Close();
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        response.Close();
}

图片上传到FTP问题

如前所述,当您将其加载到Image中时,您正在读取所有流。然而,我不认为你可以重置位置(即。"Seek")在NetworkStream(您的InputStream)上。一旦你读了它,它就消失了。

您可以做的一件事是创建一个MemoryStream并使用Stream.CopyTo将内容复制到其中。然后,你可以对它做任何你喜欢的事情,包括将位置重置为0以"再次读取它"。

//example of resetting a stream named "s"
s.Position = 0;

感谢你们的回复,他们非常有帮助,但我通过对我的代码进行如下轻微更改来修复这个问题,我在阅读输入流后检查了图像尺寸。也许有人会觉得这有用。

public string ftpUpload(HttpPostedFileBase imagefile, string filename)
        {
            var sourceStream = imagefile.InputStream;
            int BUFFER_SIZE = imagefile.ContentLength;
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE);
            if (!CheckLogoDimension(sourceStream))
            {
                sourceStream.Close();
                return "error";
            }
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpRootPath + "/" + filename);
            request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            Stream requestStream = request.GetRequestStream();
            request.ContentLength = sourceStream.Length;
            do
            {
                requestStream.Write(buffer, 0, bytesRead);
                bytesRead = sourceStream.Read(buffer, 0, BUFFER_SIZE);
            } while (bytesRead > 0);
            sourceStream.Close();
            requestStream.Close();
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            response.Close();
            return "Success";
        }