Problem
Sometimes you may want to create a process where uploading a document is mandatory. You can create a single Visualforce page with all of the fields for the record plus the field required to upload a document. You could also develop a wizard interface that allows the user to walk through a series of steps in which one would be to upload a document.Solution
Create a Visualforce page that references a controller (documented below). Note the enctype attribute on the <apex:form> tag. This Visualforce page uses only the fields necessary for uploading a document but can be expanded to include field for other records or documents in the process.| 01 | <apex:page controller="FileUploadController"> | 
| 02 | <apex:sectionHeader title="Visualforce Example" subtitle="File Upload Example"/> | 
| 03 | 
| 04 | <apex:form enctype="multipart/form-data"> | 
| 05 | <apex:pageMessages /> | 
| 06 | <apex:pageBlock title="Upload a File"> | 
| 07 | 
| 08 | <apex:pageBlockButtons > | 
| 09 | <apex:commandButton action="{!upload}" value="Save"/> | 
| 10 | </apex:pageBlockButtons> | 
| 11 | 
| 12 | <apex:pageBlockSection showHeader="false" columns="2" id="block1"> | 
| 13 | 
| 14 | <apex:pageBlockSectionItem > | 
| 15 | <apex:outputLabel value="File Name" for="fileName"/> | 
| 16 | <apex:inputText value="{!document.name}" id="fileName"/> | 
| 17 | </apex:pageBlockSectionItem> | 
| 18 | 
| 19 | <apex:pageBlockSectionItem > | 
| 20 | <apex:outputLabel value="File" for="file"/> | 
| 21 | <apex:inputFile value="{!document.body}" filename="{!document.name}" id="file"/> | 
| 22 | </apex:pageBlockSectionItem> | 
| 23 | 
| 24 | <apex:pageBlockSectionItem > | 
| 25 | <apex:outputLabel value="Description" for="description"/> | 
| 26 | <apex:inputTextarea value="{!document.description}" id="description"/> | 
| 27 | </apex:pageBlockSectionItem> | 
| 28 | 
| 29 | <apex:pageBlockSectionItem > | 
| 30 | <apex:outputLabel value="Keywords" for="keywords"/> | 
| 31 | <apex:inputText value="{!document.keywords}" id="keywords"/> | 
| 32 | </apex:pageBlockSectionItem> | 
| 33 | 
| 34 | </apex:pageBlockSection> | 
| 35 | 
| 36 | </apex:pageBlock> | 
| 37 | </apex:form> | 
| 38 | </apex:page> | 
Create an Apex class that behaves as the controller in the Visualforce page. The upload() method is key.
view source
print?
| 01 | public with sharing class FileUploadController { | 
| 02 | 
| 03 | public Document document { | 
| 04 | get { | 
| 05 | if (document == null) | 
| 06 | document = new Document(); | 
| 07 | return document; | 
| 08 | } | 
| 09 | set; | 
| 10 | } | 
| 11 | 
| 12 | public PageReference upload() { | 
| 13 | 
| 14 | document.AuthorId = UserInfo.getUserId(); | 
| 15 | document.FolderId = UserInfo.getUserId(); // put it in running user's folder | 
| 16 | 
| 17 | try { | 
| 18 | insert document; | 
| 19 | } catch (DMLException e) { | 
| 20 | ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Error uploading file')); | 
| 21 | return null; | 
| 22 | } finally { | 
| 23 | document.body = null; // clears the viewstate | 
| 24 | document = new Document(); | 
| 25 | } | 
| 26 | 
| 27 | ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO,'File uploaded successfully')); | 
| 28 | return null; | 
| 29 | } | 
| 30 | 
| 31 | } |