MVC4 C# - Souhaitez enregistrer une image dans un dossier et d'enregistrement de l'url dans la base de données
Je suis assez nouveau avec MVC4 de codage. Ont été de la programmation dans SharePoint avant.
Le problème que j'ai c'est que je veux enregistrer une image dans un dossier spécifique (disons App_Data) et aussi d'enregistrer l'url de l'image d'une chaîne de caractères dans une base de données.
Ce serait génial si quelqu'un pouvait m'aider avec ce problème.
Le code que j'ai en ce moment est.
Modèles > ImageUpload.cs
public class ImageUpload
{
public int ID { get; set; }
public string Title { get; set; }
public string Url { get; set; }
}
public class ImageUploadDBContext : DbContext
{
public DbSet<ImageUpload> ImageUploads { get; set; }
}
Contrôleurs > ImageUploadController.cs
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ImageUpload imageupload)
{
if (ModelState.IsValid)
{
db.ImageUploads.Add(imageupload);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(imageupload);
}
[HttpPost]
public ActionResult Upload(HttpPostedFileBase[] files)
{
foreach (HttpPostedFileBase file in files)
{
string picture = Path.GetFileName(file.FileName);
string path = Path.Combine(Server.MapPath("~/App_Data"), picture);
string[] paths = path.Split('.');
string time = DateTime.UtcNow.ToString();
time = time.Replace(" ", "-");
time = time.Replace(":", "-");
file.SaveAs(paths[0] + "-" + time + ".jpg");
}
ViewBag.Message = "File(s) uploaded successfully";
return RedirectToAction("Index");
}
View > ImageUpload > Index.cshtml
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Url)
</th>
<th>
Preview
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Url)
</td>
<td>
<img border="0" src="@Html.DisplayFor(modelItem => item.Url)" alt="@Html.DisplayFor(modelItem => item.Title)">
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
View > ImageUpload > Créer.cshtml
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>ImageUpload</legend>
@using (Html.BeginForm())
{
<div class="editor-label">
<b>@Html.LabelFor(Model => Model.Title)</b>
</div>
<div class="editor-field">
@Html.EditorFor(Model => Model.Title)
@Html.ValidationMessageFor(Model => Model.Title)
</div>
<div class="editor-label">
<b>@Html.LabelFor(Model => Model.Url)</b>
</div>
<div>
@Html.EditorFor(Model => Model.Url)
<input type="file" name="files" value="" multiple="multiple"/>
</div>
<div>
<input type="submit" value="Submit" />
</div>
}
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
- Je n'aurais pas pris la peine de sauver l'image de la
App_Data
dossier que si vous êtes le stockage de l'url, il ne sera pas accessible via le web. - Pourquoi avez-vous séparé de Créer et de méthodes de Téléchargement quand il semble qu'il peut faire la même chose en une seule fois?
- le stockage de l'image binaire en DB est une meilleure option..
Vous devez vous connecter pour publier un commentaire.
Le téléchargement de fichiers, vous pouvez utiliser ce code. Image sauvegardée dans un dossier et nom de fichier stocké à la base de données:
Dans le contrôleur:
Et Vue:
Combiner les deux méthodes dans une logique de la méthode, le code devrait ressembler à ceci:
Dans les actions de votre contrôleur, vous devez effectuer une requête HTTP pour récupérer l'image à partir du serveur distant:
et puis:
Évidemment, l'image est téléchargé deux fois. Une fois dans le contrôleur de la CAN et une fois de la part du client. Cela va à l'encontre de l'objectif de cette action de contrôleur et vous pourriez faire directement référence à l'image de la RDC:
Cela suppose bien entendu que le client a accès à la CAN.
Bien sûr, si votre contrôleur de l'action ne se contente pas de récupérer une image à partir d'un CDN et de les diffuser vers le client comme par exemple l'extraction de l'image à partir d'un CDN et de la redimensionner, alors vous devriez certainement prendre la première approche.
sources à partir de:stackoverflow