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:
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.