【发布时间】:2012-04-17 17:11:41
【问题描述】:
我正在尝试使用 .NET 创建图像。下面是我正在使用的代码。这在大多数情况下都可以正常工作,但有时我猜想流被切断并且我有一个损坏的文件。我通过它的 URL 获取图像。
我真的在找人来纠正我的代码或让我了解我还能做些什么。
谢谢
// Function will return the number of bytes processed
// to the caller. Initialize to 0 here.
int bytesProcessed = 0;
// Assign values to these objects here so that they can
// be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;
// Use a try/catch/finally block as both the WebRequest and Stream
// classes throw exceptions upon error
try
{
// Create a request for the specified remote file name
WebRequest request = WebRequest.Create(remoteFilename);
if (request != null)
{
// Send the request to the server and retrieve the
// WebResponse object
response = request.GetResponse();
if (response != null)
{
// Once the WebResponse object has been retrieved,
// get the stream object associated with the response's data
remoteStream = response.GetResponseStream();
// Create the local file
localStream = File.Create(localFilename);
// Allocate a 1k buffer
byte[] buffer = new byte[1024];
int bytesRead;
// Simple do/while loop to read from stream until
// no bytes are returned
do
{
// Read data (up to 1k) from the stream
bytesRead = remoteStream.Read(buffer, 0, buffer.Length);
// Write the data to the local file
localStream.Write(buffer, 0, bytesRead);
// Increment total bytes processed
bytesProcessed += bytesRead;
} while (bytesRead > 0);
}
}
}
catch (Exception e)
{
throw e;
}
finally
{
// Close the response and streams objects here
// to make sure they're closed even if an exception
// is thrown at some point
if (response != null) response.Close();
if (remoteStream != null) remoteStream.Close();
if (localStream != null) localStream.Close();
}
我收到以下错误:
Main Exception
MESSAGE: Parameter is not valid.
SOURCE: System.Drawing
TARGETSITE: System.Drawing.Image FromStream(System.IO.Stream, Boolean, Boolean)
STACKTRACE: at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
at Sitecore.Resources.Media.ImageMedia.GetImage() at Sitecore.Resources.Media.ImageMedia.UpdateMetaData(MediaStream mediaStream)
at Sitecore.Resources.Media.JpegMedia.UpdateMetaData(MediaStream mediaStream) at Sitecore.Resources.Media.MediaCreator.AttachStreamToMediaItem(Stream stream, String itemPath, String fileName, MediaCreatorOptions options)
at Sitecore.Resources.Media.MediaCreator.CreateFromStream(Stream stream, String filePath, MediaCreatorOptions options)
at Sitecore.Resources.Media.MediaCreator.CreateFromFile(String filePath, MediaCreatorOptions options)
【问题讨论】:
-
有没有发现异常??他们说什么??
-
为什么你捕获一个异常只是为了再次抛出它,却丢失了堆栈跟踪?为什么不使用
using语句? -
有时中断的 TCP 连接不会给出任何错误,只是表现得像到达了流的末尾。当我用 C# 编写下载器时,我下载到一个临时文件,并且只有在验证预期大小(来自 http 标头)与下载的大小匹配后才将其移动到目标文件名。
-
图像文件实际包含 http 404 错误消息的几率是多少?或者真的什么。用十六进制查看器看看它。
-
@CodesInChaos 有时如如何?从对等体内部的 TCP 连接获取流结束的唯一方法是发送一个 FIN,根据定义,这是一个完成的连接,而不是中断的连接。