图片上传到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();
}
如前所述,当您将其加载到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";
}