将已发布的文件上传到 FTP 会在 ASP.NET 中损坏它
Uploading a posted file to FTP corrupts it in ASP.NET
图像 HTTP 上传成功。我在加载前使用 JavaScript 进行预览。
加载图片时图片变黑。
会不会是StreamReader
的问题?
你能看到我错过了什么吗?谢谢..
asp.net
<input id="fileupload2" type="file" runat="server" clientidmode="Static" />
代码隐藏
string fileName = Path.GetFileName(fileupload2.PostedFile.FileName);
using (StreamReader fileStream = new StreamReader(fileupload2.PostedFile.InputStream))
{
fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
fileStream.Close();
}
try
{
if (fileupload2.PostedFile.ContentLength < 5120000)
{
//Create FTP Request.
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create(ftp + ftpFolder + fileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
//Enter FTP Server credentials.
request.Credentials = new NetworkCredential("USER", "PASS");
request.ContentLength = fileBytes.Length;
request.UsePassive = true;
request.UseBinary = true;
request.ServicePoint.ConnectionLimit = fileBytes.Length;
request.EnableSsl = false;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(fileBytes, 0, fileBytes.Length);
requestStream.Close();
}
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
// lblMessage.Text += fileName + " uploaded.<br />";
response.Close();
}
else
{
ScriptManager.RegisterClientScriptBlock(
this, this.GetType(), "Dikkat",
"alert('Dosya 5 MB'dan küçük olmalıdır.')", true);
}
}
catch (WebException ex)
{
throw new Exception((ex.Response as FtpWebResponse).StatusDescription);
}
我怀疑这也是由于 StreamReader
。 StreamReader 专门用于文本,而不仅仅是任何 byte[]
。
相反,我会简单地使用 FileUpload.FileBytes
来检索数据而不是 FileUpload.PostedFile.InputStream
。或者您可以使用 Stream.Read()
,它用于更通用的数据流。
fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
您尝试将二进制文件解释为 UTF-8 文本。那是行不通的。
此外,您的实现效率很低,因为您不必要地将整个文件复制到内存中。
这是一个简单高效的解决方案:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + ftpFolder + fileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("USER", "PASS");
using (Stream requestStream = request.GetRequestStream())
{
fileupload2.PostedFile.InputStream.CopyTo(requestStream);
}
不需要其他代码:
UsePassive = true
、UseBinary = true
和 EnableSsl = false
是默认值。
ContentLength
未在 FtpWebRequest
中使用。
FtpWebRequest.GetResponse
上传不需要调用。
ServicePoint.ConnectionLimit
与字节数无关
图像 HTTP 上传成功。我在加载前使用 JavaScript 进行预览。
加载图片时图片变黑。
会不会是StreamReader
的问题?
你能看到我错过了什么吗?谢谢..
asp.net
<input id="fileupload2" type="file" runat="server" clientidmode="Static" />
代码隐藏
string fileName = Path.GetFileName(fileupload2.PostedFile.FileName);
using (StreamReader fileStream = new StreamReader(fileupload2.PostedFile.InputStream))
{
fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
fileStream.Close();
}
try
{
if (fileupload2.PostedFile.ContentLength < 5120000)
{
//Create FTP Request.
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create(ftp + ftpFolder + fileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
//Enter FTP Server credentials.
request.Credentials = new NetworkCredential("USER", "PASS");
request.ContentLength = fileBytes.Length;
request.UsePassive = true;
request.UseBinary = true;
request.ServicePoint.ConnectionLimit = fileBytes.Length;
request.EnableSsl = false;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(fileBytes, 0, fileBytes.Length);
requestStream.Close();
}
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
// lblMessage.Text += fileName + " uploaded.<br />";
response.Close();
}
else
{
ScriptManager.RegisterClientScriptBlock(
this, this.GetType(), "Dikkat",
"alert('Dosya 5 MB'dan küçük olmalıdır.')", true);
}
}
catch (WebException ex)
{
throw new Exception((ex.Response as FtpWebResponse).StatusDescription);
}
我怀疑这也是由于 StreamReader
。 StreamReader 专门用于文本,而不仅仅是任何 byte[]
。
相反,我会简单地使用 FileUpload.FileBytes
来检索数据而不是 FileUpload.PostedFile.InputStream
。或者您可以使用 Stream.Read()
,它用于更通用的数据流。
fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
您尝试将二进制文件解释为 UTF-8 文本。那是行不通的。
此外,您的实现效率很低,因为您不必要地将整个文件复制到内存中。
这是一个简单高效的解决方案:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + ftpFolder + fileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("USER", "PASS");
using (Stream requestStream = request.GetRequestStream())
{
fileupload2.PostedFile.InputStream.CopyTo(requestStream);
}
不需要其他代码:
UsePassive = true
、UseBinary = true
和EnableSsl = false
是默认值。ContentLength
未在FtpWebRequest
中使用。FtpWebRequest.GetResponse
上传不需要调用。ServicePoint.ConnectionLimit
与字节数无关