Große Eingabedatei wird im Controller null?
Ich habe eine Visualforce-Seite mit einem Apex: inputFile. Ich verstehe, dass das Limit 10 MB beträgt. Wenn ich jedoch mehr als 10 MB hochlade, tritt kein Fehler auf. Der Controller wird einfach null, sodass ich dem Benutzer nicht mitteilen kann, dass die Datei abgelehnt wurde. Betrachten Sie den folgenden vereinfachten Code:
Seite:
<apex:page controller="FileErrorTestCtrl" docType="html-5.0" id="pageId" showHeader="false" lightningStylesheets="true" cache="false">
<apex:slds />
<div class="slds-scope">
<apex:form id="formId" enctype="multipart/form-data">
<article class="slds-card">
<div class="slds-card__body slds-card__body_inner">
<apex:pagemessages />
<div class="slds-grid slds-wrap slds-gutters">
<div class="slds-col slds-size_6-of-12">
<div class="slds-col slds-grid slds-wrap slds-gutters slds-size_12-of-12">
<div class="slds-col slds-size_12-of-12 slds-m-top_medium">
<p class="fieldLabel">Data Upload:</p>
<apex:inputFile value="{!dataFile}" filename="{!dataFileName}" styleclass="" id="fileButton" />
</div>
</div>
</div>
<div class="slds-col slds-size_6-of-12 rightpanel">
<div class="slds-col slds-size_12-of-12 slds-m-top_medium">
<apex:commandButton styleclass="slds-button slds-button_brand" value="Save"
action="{!save}"/>
</div>
</div>
</div>
</div>
</article>
</apex:form>
</div>
<script>
</script>
</apex:page>
Regler:
public class FileErrorTestCtrl {
public transient blob dataFile {get;set;}
public String dataFileName {get;set;}
public FileErrorTestCtrl(){
//set default values
}
public PageReference save(){
String s = 'File size: '+dataFile.size();
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.WARNING, s));
return null;
}
}
Im wahrsten Sinne des Wortes ist dies nur eine Datei zu nehmen und eine Seitennachricht mit der Dateigröße auszugeben. Wenn Sie weniger als 10 MB hochladen, funktioniert dies einwandfrei. Bei> 10 MB wird jedoch ein Fehler ausgegeben, da die Eigenschaft dataFile null ist.
Das Debug-Protokoll zeigt eine Meldung an, dass 10 MB das Limit sind. Aber wie kann ich diesen Fehler abfangen und dem Benutzer anzeigen, wenn der Controller nur null erhält?
BEARBEITEN:
Als Randnotiz, hier ist das Javascript, mit dem ich dieses Problem vollständig umgangen habe. Die akzeptierte Antwort hat jedoch die "offizielle" Möglichkeit, den Serverfehler in der Ansicht abzufangen.
<apex:inputFile value="{!dataFile}" filename="{!dataFileName}" styleclass="" id="fileButton" fileSize = "{! fileSize }" onchange="checkFileSize()"/>
function checkFileSize() {
var fileInput = document.getElementById("pageId:formId:fileButton");
if(fileInput.files.length > 0) {
var fileSize = fileInput.files[0].size;
var displaySize = (fileSize / 1048576).toFixed(2) + " MB";
var allowedSize = 10485760;
if(fileSize > allowedSize){
alert('The file size limit for this form is 10MB. Your file size is ' + displaySize + ' . The file must be sent separately when you are contacted by the team');
fileInput.value = null;
}
}
}
Antworten
Ich würde vorschlagen, die Dateigrößeigenschaft des apex:inputFileTags zu verwenden (unter Berücksichtigung des Controller-Ansatzes) -
<apex:inputFile value="{!dataFile}"
fileSize = "{! fileSize }"
filename="{!dataFileName}"
styleclass="" id="fileButton" />
Controller wird sein wie -
public Integer fileSize{get;set;}
public PageReference save(){
if( fileSize >= 10240){
String s = 'File size: '+ fileSize;
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.WARNING, s));
return null;
}
else{
//some handling
}
}