71 messaggi dal 12 settembre 2010
Ciao a tutti,
ho un problema durante la gestione di una form che prevede l'upload multiplo di files (i formati consentiti sono i seguenti: jpg|jpeg|gif|png|pdf).

I dati vengono salvati correttamente nel DB così come i files immagine...invece il PDF anche se viene caricato all'interno della cartella specificata presenta le seguenti caratteristiche:
- dimensione 0 KB
- se tento di aprirlo in preview dal browser (si trova all'interno del percorso "wwwroot/files/subfolder" quindi direi che dovrebbe essere tranquillamente accessibile dal browser) ottengo il seguente messaggio di errore "Impossibile caricare il documento PDF"
- se vado nella cartella di destinazione e tento di aprirlo con un programma apposito per PDF non riesco comunque a visualizzarlo e mi viene segnalato che il file potrebbe essere corrotto

Questo il controller che effettua il salvataggio dei dati nel DB:
public IActionResult CreatePOST()
        {
            JsonHtmlResponse retObj = new JsonHtmlResponse();

            try
            {
                _db.Add(DocumentoVM.Documento);
                _db.SaveChanges();

                var files = HttpContext.Request.Form.Files;
                string webRootPath = _hostingEnvironment.WebRootPath;
                string dirDest = Path.Combine(webRootPath, @"files\subfolder");
                int i = 0;
                foreach (var file in files)
                {
                    if(file != null)
                    {
                        var extension = Path.GetExtension(file.FileName);
                        Upload.SaveFile(dirDest, fileDest, files, i);
                        i++;
                    }
                }
                retObj.Status = true;
            }
            catch(Exception ex)
            {
                retObj.Status = false;
                retObj.SetErrMessage(ex);
            }
            
            return Json(retObj);
        }


Questo è il codice che fa riferimento alla classe "Upload":
public class Upload
    {
        private static void CreateDirectory(string d)
        {
            if (Directory.Exists(d)) { Directory.Delete(d, true); }
            Directory.CreateDirectory(d);
        }

        public static void SaveFile(string dirDest, string fileDest, IFormFileCollection files, int fileIndex)
        {
            try
            {
                if (!Directory.Exists(dirDest)) { CreateDirectory(dirDest); }


                if (!string.IsNullOrEmpty(files[fileIndex].FileName))
                {
                    using (var filestream = new FileStream(Path.Combine(dirDest, fileDest), FileMode.Create))
                    {
                        files[0].CopyTo(filestream);
                    }
                }
            }
            catch
            {
                // riprovo
                System.Threading.Thread.Sleep(250);
                CreateDirectory(dirDest);
                System.Threading.Thread.Sleep(250);
                using (var filestream = new FileStream(Path.Combine(dirDest, fileDest), FileMode.Create))
                {
                    files[0].CopyTo(filestream);
                }
            }
        }

        public static void DeleteFile(string dirDest, string fileDest)
        {
            try
            {
                File.Delete(string.Concat(dirDest, fileDest));
            }
            catch
            {
                // riprovo
                System.Threading.Thread.Sleep(250);
                File.Delete(string.Concat(dirDest, fileDest));
            }
        }
    }


Ho già provato ad inserire prima della seguente riga di codice:
files[0].CopyTo(filestream);

questa istruzione:
filestream.position = 0;


o a rendere il tutto asincrono...ma comunque alla fine il file PDF non riesco a salvarlo correttamente e quindi ad aprirlo.

Spero che qualcuno possa aiutarmi.

Grazie mille in anticipo.
71 messaggi dal 12 settembre 2010
Come non detto...ho trovato l'errore...proprio in questo punto:
files[0].CopyTo(filestream);


In presenza del download singolo andava bene xkè l'indice 0 era corretto...ma in presenza del download multiplo l'indice varia...mia svista...ho modificato nel modo seguente:
files[fileIndex].CopyTo(filestream);


Grazie lo stesso a tutti :)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.