InputFile besar menjadi null di controller?
Saya memiliki halaman visualforce dengan apex: inputFile. Saya mengerti bahwa batasnya adalah 10MB. Tapi saat saya mengupload lebih besar dari 10 MB, tidak ada error. Kontroler hanya mendapatkan null, jadi saya tidak bisa memberi tahu pengguna bahwa file tersebut ditolak. Pertimbangkan kode yang disederhanakan di bawah ini:
Halaman:
<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>
Pengontrol:
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;
}
}
Secara harfiah semua yang dilakukan ini adalah mengambil file dan mengeluarkan pesan halaman dengan ukuran file. Jika Anda mengunggah kurang dari 10 MB, itu berfungsi dengan baik. Tetapi> 10 MB, ini memberikan kesalahan karena properti dataFile adalah null.
Log debug memang menampilkan pesan yang mengatakan 10MB adalah batasnya. Tetapi bagaimana cara menangkap kesalahan itu dan menunjukkannya kepada pengguna ketika pengontrol hanya mendapatkan nol?
EDIT:
Sebagai catatan tambahan, berikut Javascript yang saya gunakan untuk menghindari masalah ini sepenuhnya. Tetapi jawaban yang diterima memiliki cara "resmi" untuk menangkap kesalahan server dalam tampilan.
<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;
}
}
}
Jawaban
Saya menyarankan untuk mencoba menggunakan properti filesize dari apex:inputFiletag (mempertimbangkan pendekatan pengontrol) -
<apex:inputFile value="{!dataFile}"
fileSize = "{! fileSize }"
filename="{!dataFileName}"
styleclass="" id="fileButton" />
Pengontrol akan seperti -
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
}
}