Fondamentalement, mon application doit être capable de gérer des téléchargements de fichiers volumineux et de cela, j'ai examiné le Fichier télécharge des documents par Microsoft .
Ici, ils mentionnent les grandes téléchargements de fichiers avec streaming, ce qui sonnait bien alors j'ai copié le code de la documentation. Cependant, mon problème est que je ne peux pas obtenir les accessoires de fichier téléchargés d'origine (nom de fichier, longueur, etc.) à partir du HTTPRequest. P>
J'ai déjà essayé d'accéder à Le code du contrôleur ressemble actuellement à ceci: P> request.fles.files code >, mais de cette façon, je reçois une exception:
IoException: extrémité inattendue de flux, le contenu peut avoir déjà été lu par un autre composant. Code> Puisque j'essaie d'accéder ensuite à la demande. P> Quelle est la meilleure façon d'obtenir le nom de fichier + la longueur après le téléchargement terminé (avec le streaming de cours)? p>
EDIT: H2>
[Authorize]
[Route("api/[controller]")]
public class FileController : Controller
{
private FileManagerDbContext _context;
public FileController(FileManagerDbContext context) {
_context = context;
}
[HttpPost("upload")]
[DisableFormValueModelBinding]
public async Task<IActionResult> Upload()
{
using (var stream = System.IO.File.Create("myfile.temp"))
{
await Request.StreamFile(stream);
}
var fileToSave = new File();
fileToSave.FileName = null;
fileToSave.FileSize = 0;
fileToSave.UploadDate = new DateTime();
_context.Files.Add(fileToSave);
_context.SaveChanges();
return Ok(fileToSave);
}
}
4 Réponses :
Cette erreur est survenue si vous n'ajoutez pas cet attribut en plus de votre méthode d'action du contrôleur. Il est utilisé pour désactiver la liaison de modèle de valeur de formulaire ici pour prendre le contrôle de la manipulation fichiers potentiellement volumineux. p>
[DisableFormvaluemodeldeling] P> blockQuote>
Hm ... L'attribut est déjà ajouté au contrôleur. Je modifierai la question avec le code du contrôleur.
D'accord, une solution de contournement que j'ai trouvée est d'activer le rembobinage HTTPRequest. Pour cela, j'avais besoin d'ajouter cette pièce de code à de cette façon, l'exception perspectifedendofstream ne sera pas lancée car, le flux peut être rembobiné. p> p> startup.cs code>:
Vous pouvez télécharger les données à l'aide du fichier de contrôle d'accès, en saisissant que le fichier a une URL publique.
var webRequest = HttpWebRequest.Create(url); using (var webResponse = webRequest.GetResponse()) { var file_size = webResponse.Headers.Get("Content-Length"); var file_name = webResponse.ResponseUri.Segments.Last(); }
Vous pouvez également rembobiner à l'intérieur de votre contrôleur si vous le souhaitez:
if (request?.ContentLength != null) { request.EnableRewind(); request.Body.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(request.Body, Encoding.UTF8)) { body = reader.ReadToEnd(); //Do your thing with the body content } }
Merci, j'utiliserai probablement cette méthode au lieu d'avoir généralement permis à la demande de rembobinage!
Pourquoi vous ne suivez-vous pas l'exemple que vous avez affiché. Vous pouvez obtenir un objet de fichier dans l'interface iformfile.
Cela ne fonctionne que dans le cas de fichiers plus petits. Lorsque des fichiers volumineux sont téléchargés et que vous souhaitez les télécharger à l'aide de streaming, vous devez utiliser le HTTPRequest et ne pas obtenir la demande à l'aide de l'interface IFORM.