MVC의 Ajax.BeginForm을 사용하여 파일을 업로드합니다.
저는 여기서 언급한 ASP를 하는 방법을 예로 들려고 했습니다.NET MVC Ajax 폼 포스트에 멀티파트/폼 데이터 포함?
그러나 "fail" 오류 메시지 상자가 계속 나타납니다.
Index.cshtml
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<h2>Files Upload</h2>
<script type="text/javascript">
$(function() {
$("#form0").submit(function(event) {
var dataString;
event.preventDefault();
var action = $("#form0").attr("action");
if ($("#form0").attr("enctype") == "multipart/form-data") {
//this only works in some browsers.
//purpose? to submit files over ajax. because screw iframes.
//also, we need to call .get(0) on the jQuery element to turn it into a regular DOM element so that FormData can use it.
dataString = new FormData($("#form0").get(0));
contentType = false;
processData = false;
} else {
// regular form, do your own thing if you need it
}
$.ajax({
type: "POST",
url: action,
data: dataString,
dataType: "json", //change to your own, else read my note above on enabling the JsonValueProviderFactory in MVC
contentType: contentType,
processData: processData,
success: function(data) {
//BTW, data is one of the worst names you can make for a variable
},
error: function(jqXHR, textStatus, errorThrown) {
//do your own thing
alert("fail");
}
});
}); //end .submit()
});
</script>
<div id="uploadDiv">
@Html.Action("Files", "Home")
</div>
@using (Ajax.BeginForm("Files", "Home", new AjaxOptions { UpdateTargetId = "uploadDiv", HttpMethod = "Post" }, new { enctype = "multipart/form-data", @id="form0"}))
{
<div>
<div>Upload new file:
<input type="file" name="file" /></div>
<input type="submit" value="Save" />
</div>
}
<br />
컨트롤러
public PartialViewResult Files(HttpPostedFileBase file)
{
IEnumerable<string> files;
if ((file != null) && (file.ContentLength > 0))
{
string fileName = file.FileName;
string saveLocation = @"D:\Files";
string fullFilePath = Path.Combine(saveLocation, fileName);
try
{
file.SaveAs(fullFilePath);
FileInfo fileInfo = new FileInfo(fullFilePath);
file.InputStream.Read(new byte[fileInfo.Length], 0, file.ContentLength);
}
catch (Exception e)
{
TempData["FileUpload"] = e.Message;
return PartialView();
}
files = Directory.GetFiles(@"D:\Files\");
return PartialView(files);
}
else
{
files = Directory.GetFiles(@"D:\Files\");
return PartialView(files);
}
}
Files.cshtml
@model IEnumerable<string>
@foreach (string f in Model)
{
<p>@f</p>
}
Global.asax
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
이것은 복잡합니다.jquery forms 플러그인을 사용하는 것이 좋습니다.
다음은 샘플입니다.
Html.BeginForm
@using (Html.BeginForm("YourAction", "YourController"))
{
@Html.AntiForgeryToken()
<input type="file" name="files"><br>
<input type="submit" value="Upload File to Server">
}
액션 방법
[HttpPost]
[ValidateAntiForgeryToken]
public void YourAction(IEnumerable<HttpPostedFileBase> files)
{
if (files != null)
{
foreach (var file in files)
{
// Verify that the user selected a file
if (file != null && file.ContentLength > 0)
{
// extract only the fielname
var fileName = Path.GetFileName(file.FileName);
// TODO: need to define destination
var path = Path.Combine(Server.MapPath("~/Upload"), fileName);
file.SaveAs(path);
}
}
}
}
진행률 바
<div class="progress progress-striped">
<div class="progress-bar progress-bar-success">0%</div>
</div>
Jquery & Form 스크립트
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<script src="http://malsup.github.com/jquery.form.js"></script>
<script>
(function() {
var bar = $('.progress-bar');
var percent = $('.progress-bar');
var status = $('#status');
$('form').ajaxForm({
beforeSend: function() {
status.empty();
var percentVal = '0%';
bar.width(percentVal)
percent.html(percentVal);
},
uploadProgress: function(event, position, total, percentComplete) {
var percentVal = percentComplete + '%';
bar.width(percentVal)
percent.html(percentVal);
},
success: function() {
var percentVal = '100%';
bar.width(percentVal)
percent.html(percentVal);
},
complete: function(xhr) {
status.html(xhr.responseText);
}
});
})();
</script>
업데이트...
액션 메서드를 두 번 호출하는 문제가 발생하는 것은 Ajax 때문입니다.BeginForm, Html로 변환해 주세요.Begin Form()을 클릭합니다.자세한 설명과 샘플 코드의 다운로드에 대해서는, 이 블로그를 참조해 주세요.
정답은Ashwini Verma
거의 맞지만 단점이 있습니다.양식이 두 번 제출됩니다.
이는 의 사용에 의해 발생합니다.Ajax.BeginForm()
.사용.Html.BeginForm()
고쳐줄 거야
다음은 예를 제시하겠습니다.
@* do not use Ajax.BeginForm() as it would cause the form to submit twice in connection with jQuery.Form *@
@using (var lForm = Html.BeginForm(
<ActionName>, <ControllerName>, FormMethod.Post,
new Dictionary<string, object> {{"name", <YourFormName>}, {"enctype", "multipart/form-data"}}))
{
base64 인코딩 데이터를 가져오려면 클라이언트의 html5 파일 처리 및 파일 내용 읽기가 필요합니다.
클라이언트에는 다음 항목을 추가해야 합니다.
<div>
@Html.HiddenFor(m => m.AttachmentFileName)
@Html.HiddenFor(m => m.AttachmentFileSize)
@Html.HiddenFor(m => m.AttachmentFileType)
@Html.HiddenFor(m => m.AttachmentFileContentsBase64)
<input type="file" name="AttachmentFile" id="AttachmentFile" onchange="handleAttachmentFileChange(this.files)" />
@Html.ValidationMessageFor(m => m.AttachmentFile)
</div>
<script>
function handleAttachmentFileChange(files) {
var file = files[0];
$("#AttachmentFileName").val(file.name);
$("#AttachmentFileSize").val(file.size);
$("#AttachmentFileType").val(file.type || "application/octet-stream");
var fileReader = new FileReader();
fileReader.onload = function () {
fileReader.result;
$("#AttachmentFileContentsBase64").val(fileReader.result);
};
fileReader.readAsDataURL(file);
};
</script>
따라서 코드는 숨김 필드를 파일 데이터(파일 이름, 유형, 크기, base64 인코딩 콘텐츠)로 채웁니다.서버측에는, 다음과 같은 것이 있습니다.
if (AttachmentFileSize > 0)
{
string fileName = AttachmentFileName.Contains("\\") ? AttachmentFileName.Substring(AttachmentFileName.LastIndexOf("\\") + 1) : AttachmentFileName;
byte[] fileBytes = Convert.FromBase64String(AttachmentFileContentsBase64.Substring(AttachmentFileContentsBase64.IndexOf(',') + 1));
//save file to file system or db
ModelState.Remove("CurrentAttachmentFileId");
ModelState.Remove("CurrentAttachmentFileName");
}
else if (AttachmentFileSize == -1)
{
//remove existing file from fs or db
}
당신의 모델과 논리에 맞게 코드를 수정해야 하는데, 그것은 나에게 효과가 있었다.
언급URL : https://stackoverflow.com/questions/19042116/ajax-beginform-in-mvc-to-upload-files
'programing' 카테고리의 다른 글
woocommerce orders.php 열을 수정합니다. (0) | 2023.03.27 |
---|---|
구성 요소 정의에 표시 이름 react/display-name이 없습니다. (0) | 2023.03.27 |
반응 폼 검증:처음에 송신 버튼을 무효로 하는 방법 (0) | 2023.03.27 |
Spring Boot + REST 응용 프로그램에서 "No message available" (메시지가 없습니다) 오류가 나타난다. (0) | 2023.03.27 |
react-router의 URL에서 해시를 제거하는 방법 (0) | 2023.03.27 |