Je ne comprends pas ce que je fais mal ici. Je génère quelques flux de mémoire et en mode débogage, je constate qu'ils sont remplis. Mais lorsque j'essaie de copier MemoryStream
vers FileStream
afin de sauvegarder le fichier fileStream
n'est pas renseigné et que le fichier a une longueur de 0 octet (vide).
Voici mon code
if (file.ContentLength > 0)
{
var bytes = ImageUploader.FilestreamToBytes(file); // bytes is populated
using (var inStream = new MemoryStream(bytes)) // inStream is populated
{
using (var outStream = new MemoryStream())
{
using (var imageFactory = new ImageFactory())
{
imageFactory.Load(inStream)
.Resize(new Size(320, 0))
.Format(ImageFormat.Jpeg)
.Quality(70)
.Save(outStream);
}
// outStream is populated here
var fileName = "test.jpg";
using (var fileStream = new FileStream(Server.MapPath("~/content/u/") + fileName, FileMode.CreateNew, FileAccess.ReadWrite))
{
outStream.CopyTo(fileStream); // fileStream is not populated
}
}
}
}
Vous devez réinitialiser la position du flux avant de copier.
outStream.Position = 0;
outStream.CopyTo(fileStream);
Vous avez utilisé outStream
lors de l'enregistrement du fichier à l'aide de imageFactory
. Cette fonction a rempli le outStream
. Lors du remplissage du outStream
, la position est définie à la fin de la zone peuplée. Ainsi, lorsque vous continuez à écrire des octets sur Steam, cela ne remplace pas les octets existants. Mais ensuite, pour le lire (à des fins de copie), vous devez définir la position au début de sorte que vous puissiez commencer à lire au début.
Si votre objectif est simplement de vider le flux de mémoire dans un fichier physique (par exemple, pour regarder le contenu), vous pouvez le faire en un seul geste:
memoryStream.Position = 0;
System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray());
Une autre alternative à CopyTo
est WriteTo
.
Avantage:
Pas besoin de réinitialiser la position.
Utilisation:
outStream.WriteTo(fileStream);
Écrit l'intégralité du contenu de ce flux de mémoire dans un autre flux.