Загрузка файла MVC3 Valums Ajax
Я пытаюсь использовать valums ajax uploader. http://valums.com/ajax-upload/
На моей странице есть следующее:
var button = $('#fileUpload')[0];
var uploader = new qq.FileUploader({
element: button,
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
sizeLimit: 2147483647, // max size
action: '/Admin/Home/Upload',
multiple: false
});
он отправляет сообщение на мой контроллер, но qqfile всегда равен нулю. Я пробовал:
public ActionResult Upload(HttpPostedFile qqfile)
AND
HttpPostedFileBase file = Request.Files["file"];
без везения.
Я нашел пример для ruby на рельсах, но не уверен, как его реализовать в MVC
http://www.jigsawboys.com/2010/10/06/ruby-on-rails-ajax-file-upload-with-valum/
В firebug я вижу следующее:
http://localhost:61143/Admin/Home/Upload?qqfile=2glonglonglongname+-+Copy.gif
![enter image description here]()
![enter image description here]()
![enter image description here]()
![enter image description here]()
Ответы
Ответ 1
Я понял это. это работает в IE и Mozilla.
[HttpPost]
public ActionResult FileUpload(string qqfile)
{
var path = @"C:\\Temp\\100\\";
var file = string.Empty;
try
{
var stream = Request.InputStream;
if (String.IsNullOrEmpty(Request["qqfile"]))
{
// IE
HttpPostedFileBase postedFile = Request.Files[0];
stream = postedFile.InputStream;
file = Path.Combine(path, System.IO.Path.GetFileName(Request.Files[0].FileName));
}
else
{
//Webkit, Mozilla
file = Path.Combine(path, qqfile);
}
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
System.IO.File.WriteAllBytes(file, buffer);
}
catch (Exception ex)
{
return Json(new { success = false, message = ex.Message }, "application/json");
}
return Json(new { success = true }, "text/html");
}
Ответ 2
Этот компонент отправляет application/octet-stream
вместо multipart/form-data
, с которым может работать связующее устройство по умолчанию. Поэтому вы не можете ожидать, что Request.Files
будет иметь какое-либо значение с таким запросом.
Вам потребуется вручную прочитать поток запросов:
public ActionResult Upload(string qqfile)
{
var stream = Request.InputStream;
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
var path = Server.MapPath("~/App_Data");
var file = Path.Combine(path, qqfile);
File.WriteAllBytes(file, buffer);
// TODO: Return whatever the upload control expects as response
}
Ответ 3
IE загружается с использованием multipart-mime. Другие браузеры используют Octet-Stream.
Я написал обработчик загрузки для работы с Valums Ajax Uploader, который работает как с MVC, так и с Webforms и с обоими методами. Я был бы рад поделиться с вами, если бы захотел. Он внимательно следит за обработчиком PHP.
Мой контроллер для обработки загрузки выглядит следующим образом:
public class UploadController : Controller
{
private IUploadService _Service;
public UploadController()
: this(null)
{
}
public UploadController(IUploadService service)
{
_Service = service ?? new UploadService();
}
public ActionResult File()
{
return Content(_Service.Upload().ToString());
}
UploadService выглядит так:
public class UploadService : IUploadService
{
private readonly qq.FileUploader _Uploader;
public UploadService()
: this(null)
{ }
public UploadService(IAccountService accountservice)
{
_Uploader = new qq.FileUploader();
}
public UploadResult Upload()
{
qq.UploadResult result = _Uploader.HandleUpload();
if (!result.Success)
return new UploadResult(result.Error);
.... code .....
return new UploadResult((Guid)cmd.Parameters["@id"].Value);
}
catch (Exception ex)
{
return new UploadResult(System.Web.HttpUtility.HtmlEncode(ex.Message));
}
finally
{
............code.........
}
}
...............code ............
Ответ 4
Вы должны попробовать:
Stream inputStream = (context.Request.Files.Count > 0) ? context.Request.Files[0].InputStream : context.Request.InputStream;
Ответ 5
Я развиваюсь в ASP.Net 4.0, но у нас нет архитектуры MVC. У меня была такая же проблема несколько дней назад. Но я понял это, и вот мое решение.
//For IE Browser
HttpPostedFile selectedfile = Request.Files[0];
System.Drawing.Bitmap obj = new System.Drawing.Bitmap(selectedfile.InputStream);
//For Non IE Browser
System.Drawing.Bitmap obj = new System.Drawing.Bitmap(Request.InputStream);
Теперь вы можете использовать obj для дальнейшей работы.