2009-06-09 15 views
56

मुझे एक एमवीसी ऐप में एक साधारण रूप मिला है। इसमें एक फ़ाइल फ़ील्ड है ताकि उपयोगकर्ता एक छवि अपलोड कर सकें। यह सब महान काम करता है।एएसपी.नेट एमवीसी में असफल सत्यापन के बाद इनपुट प्रकार = फ़ाइल फ़ील्ड मान कैसे रखें?

समस्या यह है कि, यदि फ़ॉर्म सबमिट करने में विफलता विफल हो जाती है तो फ़ाइल फ़ील्ड की सामग्री खो जाती है (अन्य फ़ील्ड पॉप्युलेट हो जाते हैं, thx HtmlHelpers!)। असफल सत्यापन के बाद मैं फ़ाइल फ़ील्ड को पॉप्युलेट कैसे रखूं?

टीआईए!

उत्तर

53

ब्राउज़र जोखिम सुरक्षा जोखिमों के कारण इस तरह से डिजाइन किए गए हैं। HTML स्रोत या जावास्क्रिप्ट द्वारा फ़ाइल इनपुट बॉक्स का मान सेट करना असंभव है। अन्यथा दुर्भावनापूर्ण स्क्रिप्ट उपयोगकर्ता के ध्यान के बिना कुछ निजी फाइल चुरा सकती है।

इस विषय के बारे में an interesting information है।

+0

हाँ, मैं सुरक्षा सिद्धांत को समझता हूं। बस इच्छा है कि मैंने जो परिदृश्य वर्णित किया है, उसके लिए यह संभव था, क्योंकि केवल मेरे द्वारा उपयोगकर्ता अनुभव प्रभावित हुआ है। ;/ – Chaddeus

+8

अपनी यूएक्स समस्या को ठीक करने के लिए कि उपयोगकर्ता को फ़ाइल को दोबारा चयन करना होगा: जब आप पहली बार सेट फ़ाइल के साथ फॉर्म सबमिट करते हैं तो आप सर्वर को एक अस्थायी कैश में फ़ाइल को स्टोर कर सकते हैं। फिर यदि सत्यापन विफल हो जाता है, तो आप फ़ील्ड सेट होने का संकेत देने के लिए फ़ाइल नाम (या थंबनेल) को सरल दिखाते हैं। सत्यापन पूर्ण होने के बाद, आप फ़ाइल कैश को अपने कैश से प्राप्त करते हैं। – tsauerwein

+5

@tsauerwen, अच्छी तरह से एमवीसी स्टेटलेस मॉडल के उद्देश्य को हरा देता है। – Triynko

2

जहाँ तक मुझे पता है कि आप एक HTML फ़ाइल इनपुट बॉक्स का मान सेट नहीं कर सकते हैं। मैं एक लेबल या टेक्स्ट बॉक्स के साथ फ़ाइल इनपुट बॉक्स युग्मन करने का सुझाव दूंगा।

फिर आप बाद में पुनः सबमिट करने के लिए फ़ाइल इनपुट बॉक्स से मूल्य के साथ इसे पॉप्युलेट कर सकते हैं।

+0

दिलचस्प ... आप एक साइट है कि यह इस तरह से लागू किया गया है के बारे में पता है? उदाहरण ढूंढ रहे हैं ... धन्यवाद। – Chaddeus

+0

जीमेल अपने अनुलग्नकों के साथ कुछ समान उपयोग करता है। फ़ाइल अपलोड होने के बाद यह टेक्स्ट बदल जाता है। हालांकि यह AJAX का उपयोग करके असीमित रूप से किया जाता है। – Michael

1

फ़्लैश आधारित फ़ाइल अपलोडर हैं। उनमें से एक आज़माएं। फ्लैश और जावा स्क्रिप्ट समर्थित नहीं होने पर उनमें से कुछ नियमित फ़ाइल इनपुट बॉक्स पर भी वापस आते हैं। मैं jQuery प्लगइन्स की तलाश करने की सलाह देते हैं।

1

यदि फ़ाइल बहुत बड़ी नहीं है तो आप इसे 6464 कर सकते हैं और इसे एक छिपे हुए फ़ील्ड के मान के रूप में उपयोग कर सकते हैं।

0

आप एक HTML फ़ाइल इनपुट बॉक्स का मान सेट नहीं कर सकते हैं। वर्कअराउंड के रूप में, सत्यापन के बाद फॉर्म आउटपुट करते समय फ़ाइल अपलोड बॉक्स को एक छिपे हुए इनपुट फ़ील्ड से प्रतिस्थापित करें।

सबमिशन पर, आप फ़ाइल इनपुट बॉक्स (बाद में पुनः सबमिट करने के लिए) से मूल्य के साथ छिपे हुए फ़ील्ड को पॉप्युलेट करते हैं। किसी भी एक समय (नहीं दोनों) पर या तो फाइल अपलोड या छिपी हुई फ़ील्ड नाम वर्तमान के लिए याद रखें:

नोट: नीचे कोड चित्रण/स्पष्टीकरण केवल उद्देश्यों के लिए है। इसे आपके द्वारा उपयोग की जाने वाली भाषा के लिए उचित कोड के साथ बदलें।

<?php /* You may need to sanitize the value of $_POST['file_upload']; 
* this is just a start */ 
if(isset($_POST['file_upload']) && !empty($_POST['file_upload'])){ ?> 
<input type="hidden" name="file_upload" value="<?php print($_POST['file_upload']); ?>" /> 
<?php } else { ?> 
<input type="file" name="file_upload" /> 
<?php } ?> 
+0

"किसी भी समय फ़ाइल अपलोड या छुपा फ़ील्ड नाम मौजूद होना याद रखें (दोनों नहीं)।" खैर, क्या होगा, सत्यापन के बाद, उपयोगकर्ता अपने दिमाग को बदलता है और एक अलग फ़ाइल का चयन करना चाहता है? – Triynko

0

मैं पहले से AJAX के माध्यम से सत्यापन करने और आंशिक पृष्ठ अपडेट करने की अनुशंसा करता हूं। इस मामले में, आप फ़ाइल खो देंगे नहीं।

0

मैं "असंभव" के साथ सही उत्तर के रूप में चिह्नित होने में सहमत होने में असफल रहा। यदि कोई अभी भी किसी संभावना की तलाश में है, तो यहां मेरे आसपास काम करने वाला काम है। मैं एमवीसी 5 का उपयोग कर रहा हूँ। विचार एक सत्र चर का उपयोग करना है। मुझे ASP.Net Form से विचार मिला।

मेरे मॉडल/ViewModel (केवल प्रासंगिक गुण):

public partial class emp_leaves 
    { 
     public string fileNameOrig { get; set; } 
     public byte[] fileContent { get; set; } 

     public HttpPostedFileBase uploadFile { get; set; } 
    } 

मेरी नियंत्रक में (HttpPost): // चेक

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(emp_leaves emp_leaves) 
{ 
    if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName)) 
    { 
     emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName); 
     emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength]; 
     emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength); 
     Session["emp_leaves.uploadFile"] = emp_leaves.uploadFile; //saving the file in session variable here 
    } 
    else if (Session["emp_leaves.uploadFile"] != null) 
    {//if re-submitting after a failed validation you will reach here. 
     emp_leaves.uploadFile = (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; 
     if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName)) 
     { 
      emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName); 
      emp_leaves.uploadFile.InputStream.Position = 0; 
      emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength]; 
      emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);  
     } 
    } 
//code to save follows here... 
} 

अंत भीतर मेरे विचार संपादित करें: यहाँ, मैं सशर्त हूँ फ़ाइल अपलोड नियंत्रण दिखा रहा है।

< script type = "text/javascript" > 
 
    $("#removefile").on("click", function(e) { 
 
    if (!confirm('Delete File?')) { 
 
     e.preventDefault(); 
 
     return false; 
 
    } 
 
    $('#fileNameOrig').val(''); 
 
    //toggle visibility for concerned div 
 
    $('#downloadlrfdiv').hide(); 
 
    $('#uploadlrfdiv').show(); 
 
    return false; 
 
    }); < 
 
/script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 
@model PPMSWEB.Models.emp_leaves @{ HttpPostedFileBase uploadFileSession = Session["emp_leaves.uploadFile"] == null ? null : (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; } @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" 
 
})) { @Html.AntiForgeryToken() 
 
<div class="row"> 
 
    @*irrelevant content removed*@ 
 
    <div id="downloadlrfdiv" @((!String.IsNullOrEmpty(Model.fileNameOrig) && (Model.uploadFile==n ull || uploadFileSession !=null)) ? "" : "style=display:none;")> 
 
    <label>Attachment</label> 
 
    <span> 
 
      <strong> 
 
       <a id="downloadlrf" href="@(uploadFileSession != null? "" : Url.Action("DownloadLRF", "emp_leaves", new { empLeaveId = Model.ID }))" class="text-primary ui-button-text-icon-primary" title="Download attached file"> 
 
        @Model.fileNameOrig 
 
       </a> 
 
      </strong> 
 
      @if (isEditable && !Model.readonlyMode) 
 
      { 
 
       @Html.Raw("&nbsp"); 
 
       <a id="removefile" class="btn text-danger lead"> 
 
        <strong title="Delete File" class="glyphicon glyphicon-minus-sign"> </strong> 
 
       </a> 
 
      } 
 
      </span> 
 
    </div> 
 
    <div id="uploadlrfdiv" @(!(!String.IsNullOrEmpty(Model.fileNameOrig) && Model.uploadFile==n ull) && !Model.readonlyMode ? "" : "style=display:none;")> 
 
    <label>Upload File</label> @Html.TextBoxFor(model => model.uploadFile, new { @type = "file", @class = "btn btn-default", @title = "Upload file (max 300 KB)" }) @Html.ValidationMessageFor(x => x.uploadFile) 
 
    </div> 
 
</div> 
 
}

संबंधित मुद्दे