route - ¿Cómo usar el paquete plupload con ASP.NET MVC?
select asp-for asp-items (2)
Estoy usando la versión de plupload 1.3.0
Más específicamente, ¿cómo debo definir mi acción de controlador para soportar fragmentación? ¿Puedo usar HttpPosteFileBase
como parámetro?
En este momento estoy usando el siguiente código para inicializar el complemento
En la etiqueta HEAD
<link type="text/css" rel="Stylesheet" media="screen" href="<%: Url.Content( "~/_assets/css/plupload/jquery.ui.plupload.css" )%>" />
<link type="text/css" rel="Stylesheet" media="screen" href="<%: Url.Content( "~/_assets/css/plupload/gsl.plupload.css" )%>" />
<script type="text/javascript" src="<%: Url.Content( "~/_assets/js/plupload/gears_init.js" )%>"></script>
<script type="text/javascript" src="<%: Url.Content( "~/_assets/js/plupload/plupload.full.min.js" )%>"></script>
<script type="text/javascript" src="<%: Url.Content( "~/_assets/js/plupload/jquery.ui.plupload.min.js" )%>"></script>
En el documento listo
$("#uploader").pluploadQueue({
runtimes: ''html5,html4,gears,flash,silverlight'',
url: ''<%: Url.Content( "~/Document/Upload" ) %>'',
max_file_size: ''5mb'',
chunk_size: ''1mb'',
unique_names: true,
filters: [
{ title: "Documenti e Immagini", extensions: "doc,docx,xls,xlsx,pdf,jpg,png" }
],
multiple_queues: false
});
Mira aquí:
$("#uploader").pluploadQueue({
// General settings
runtimes: ''silverlight'',
url: ''/Home/Upload'',
max_file_size: ''10mb'',
chunk_size: ''1mb'',
unique_names: true,
multiple_queues: false,
// Resize images on clientside if we can
resize: { width: 320, height: 240, quality: 90 },
// Specify what files to browse for
filters: [
{ title: "Image files", extensions: "jpg,gif,png" },
{ title: "Zip files", extensions: "zip" }
],
// Silverlight settings
silverlight_xap_url: ''../../../Scripts/upload/plupload.silverlight.xap''
});
// Client side form validation
$(''form'').submit(function (e) {
var uploader = $(''#uploader'').pluploadQueue();
// Files in queue upload them first
if (uploader.files.length > 0) {
// When all files are uploaded submit form
uploader.bind(''StateChanged'', function () {
if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) {
$(''form'')[0].submit();
}
});
uploader.start();
} else {
alert(''You must queue at least one file.'');
}
return false;
});
Y en el controlador:
[HttpPost]
public string Upload( ) {
HttpPostedFileBase FileData = Request.Files[0];
if ( FileData.ContentLength > 0 ) {
var fileName = Path.GetFileName( FileData.FileName );
var path = Path.Combine( Server.MapPath( "~/Content" ), fileName );
FileData.SaveAs( path );
}
return "Files was uploaded successfully!";
}
Eso es todo ... No se necesita ningún trozo en Controller ...
Aqui tienes:
[HttpPost]
public ActionResult Upload(int? chunk, string name)
{
var fileUpload = Request.Files[0];
var uploadPath = Server.MapPath("~/App_Data");
chunk = chunk ?? 0;
using (var fs = new FileStream(Path.Combine(uploadPath, name), chunk == 0 ? FileMode.Create : FileMode.Append))
{
var buffer = new byte[fileUpload.InputStream.Length];
fileUpload.InputStream.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, buffer.Length);
}
return Content("chunk uploaded", "text/plain");
}
Este método se llamará varias veces para cada fragmento y para cada archivo que se cargue. Pasará como parámetro el tamaño del fragmento y el nombre del archivo. No estoy seguro de si podría usar un HttpPostedFileBase
como parámetro de acción porque el nombre no es determinista.