Pour répondre au cas d’utilisation, un service d’envoi personnalisé a été créé pour stocker les données et pièces jointes envoyées dans Azure. Lorsque le formulaire basé sur des composants principaux est envoyé, les données sont au format suivant :
{
"Name": "Gloria Rios",
"EmailID": "grios@email.com",
"ExistingCustomer": [
"Yes"
],
"PhoneNumber": "1234567890",
"Solution": "Forms",
"contractcopy": {
"name": "annualcontract.pdf",
"size": 80194,
"mediaType": "application/pdf",
"data": "[object File]"
},
"Message": "We would like to renew our annual contract "
}
L’élément contractcopy représente un composant de pièce jointe de fichier et est utilisé pour capturer les pièces jointes envoyées avec le formulaire.
Pour pouvoir préremplir le formulaire adaptatif avec les données et ses pièces jointes, les pièces jointes envoyées seront enregistrées dans le portail Azure et l’élément de données de l’objet contractcopy dans les données envoyées sera mis à jour avec l’URL de la pièce jointe enregistrée.
Le service d’envoi personnalisé extrait et stocke les pièces jointes dans le portail Azure. Les données envoyées mises à jour ressembleront à ceci :
{
"Name": "Gloria Rios",
"EmailID": "grios@email.com",
"ExistingCustomer": [
"Yes"
],
"PhoneNumber": "1234567890",
"Solution": "Forms",
"contractcopy": {
"name": "annualcontract.pdf",
"size": 80194,
"mediaType": "application/pdf",
"data": "https://aemformstutorial.blob.core.windows.net/benefiitsenrollment/69d5a2?sv=2022-11-02&ss=bfqt&srt=KiHs0%3D"
},
"Message": "We would like to renew our annual contract "
}
``
package com.azuredemo.core;
import com.adobe.aemds.guide.common.GuideValidationResult;
import com.adobe.aemds.guide.model.FormSubmitInfo;
import com.adobe.aemds.guide.service.FormSubmitActionService;
import com.adobe.aemds.guide.utils.GuideConstants;
import com.adobe.forms.common.service.FileAttachmentWrapper;
import com.azuredemo.core.SaveAndFetchFromAzure.StoreAndFetchDataFromAzureStorage;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Component(
service = FormSubmitActionService.class,
immediate = true
)
public class StoreFormDataWithAttachments implements FormSubmitActionService {
private static final String serviceName = "Store Submitted Form Data in Azure";
private static transient Logger logger = LoggerFactory.getLogger(StoreFormDataWithAttachments.class);
@Reference
DataManager dataManager;
@Reference
StoreAndFetchDataFromAzureStorage storeAndFetchDataFromAzureStorage;
@Override
public String getServiceName() {
return serviceName;
}
@Override
public Map < String, Object > submit(FormSubmitInfo formSubmitInfo) {
logger.debug("@@@@in my custom submit!!!");
Map < String, Object > result = new HashMap < > ();
result.put(GuideConstants.FORM_SUBMISSION_COMPLETE, Boolean.FALSE);
try {
String guideContainerPath = formSubmitInfo.getFormContainerPath();
String submittedFormName = formSubmitInfo.getFormContainerResource().getParent().getParent().getName();
logger.debug("The submitted form name is " + submittedFormName);
String data = formSubmitInfo.getData();
logger.debug("The submitted data is " + data);
JsonObject jsonData = new Gson().fromJson(data, JsonObject.class);
if (formSubmitInfo.getFileAttachments() != null && formSubmitInfo.getFileAttachments().size() > 0) {
logger.debug("#####The form submitted has file attachments");
for (int i = 0; i < formSubmitInfo.getFileAttachments().size(); i++) {
FileAttachmentWrapper fileAttachment = formSubmitInfo.getFileAttachments().get(i);
logger.debug("The url of the file attachment is " + fileAttachment.getUri());
logger.debug("The data ref of the file attachment is " + fileAttachment.getDataRef());
String fileName = fileAttachment.getFileName();
logger.debug("The fileName is " + fileName);
logger.debug("#### Writing " + fileName + " to azure");
String dataUrl = storeAndFetchDataFromAzureStorage.saveFormAttachmentinAzure(fileAttachment.getInputStream(), fileName, fileAttachment.getContentType());
jsonData.getAsJsonObject(fileAttachment.getDataRef()).addProperty("data", dataUrl);
logger.debug(jsonData.toString());
}
}
String uniqueID = UUID.randomUUID().toString();
logger.debug(storeAndFetchDataFromAzureStorage.saveFormDatainAzure(jsonData.toString(), "text/plain"));
if (dataManager != null) {
dataManager.put(uniqueID, data);
}
logger.info("AF Submission successful using custom submit service for: {}", guideContainerPath);
result.put(GuideConstants.FORM_SUBMISSION_COMPLETE, Boolean.TRUE);
result.put(DataManager.UNIQUE_ID, uniqueID);
// adding id here so that this available in redirect parameters in final thank you page
Map < String, Object > redirectParamMap = new HashMap < String, Object > () {
{
put(DataManager.UNIQUE_ID, uniqueID);
}
};
result.put("fd:redirectParameters", redirectParamMap);
} catch (Exception ex) {
logger.error("Error while using the AF Submit service", ex);
GuideValidationResult guideValidationResult = new GuideValidationResult();
guideValidationResult.setOriginCode("500");
guideValidationResult.setErrorMessage("Internal server error");
result.put(GuideConstants.FORM_SUBMISSION_ERROR, guideValidationResult);
}
return result;
}
}