Wednesday, December 25, 2019

X++ Code to Create an attachment in D365

using Microsoft.Dynamics.ApplicationPlatform.Services.Instrumentation;
using Microsoft.DynamicsOnline.Infrastructure.Components.SharedServiceUnitStorage;
using Microsoft.Dynamics.AX.Framework.FileManagement;
public class AzureBlobStorage
{
str docfiletype;
    Microsoft.Dynamics.AX.Framework.FileManagement.IDocumentStorageProvider storageProvider;
  public  boolean createAttachment(TableId tableId, RefRecId _refFieldId,Filename _Filename,Filename _filePath)
    {
        boolean                     ret = false;
         DocuRef     docuref;
        str downloadUrl;
        System.IO.Stream    _stream;
        _stream = File::UseFileFromURL(_filePath);
        str _contentType = System.Web.MimeMapping::GetMimeMapping(_filePath);
        DocuType fileType = DocuType::find(DocuType::typeFile());
        storageProvider = Docu::GetStorageProvider(fileType, true, curUserId());

        if(storageProvider)
        {
            str uniqueFileName = storageProvider.GenerateUniqueName(_Filename);
            str fileNameWithoutExtension = System.IO.Path::GetFileNameWithoutExtension(_filePath);
            str fileExtension = Docu::GetFileExtension(uniqueFileName);
 
            if(Docu::validateExtension(fileExtension))
            {
                guid FileId = newGuid();
                DocuValue docValue;
                docValue.Name = fileNameWithoutExtension;
                docValue.FileId = FileId;
                docValue.FileName = uniqueFileName;
                docValue.FileType = fileExtension;
                docValue.OriginalFileName = _Filename;
                docValue.Type = DocuValueType::Others;
                docValue.StorageProviderId = storageProvider.ProviderId;
                DocumentLocation location = storageProvider.SaveFile(docValue.FileId, uniqueFileName, _contentType, _stream);
               
                if (location != null)
                {
                    if(location.NavigationUri)
                    {
                        docValue.Path = location.get_NavigationUri().ToString();
                    }

                    if(location.AccessUri)
                    {
                        docValue.AccessInformation = location.get_AccessUri().ToString();
                        //info(docValue.AccessInformation);
                    }

                    if (docValue.validateWrite())
                    {
                     
                        docValue.insert();
                        DocuUploadResult DocuUploadResult =  new DocuUploadResult(_fileName, _contentType, false, "", newGuid());
                        DocuUploadResult.fileId(FileId);
                        docuref = DocuUploadResult.createDocuRef(tableId,_refFieldId,DocuType::typeFile());
                        if(docuref)
                        {
                            ret =  true;
                        }
                        else
                        {
                            ret =  false;
                        }


                    }
                }
            }

        }

X++ code to read or delete a file from AZURE in D365

using Microsoft.Dynamics.ApplicationPlatform.Services.Instrumentation;
using Microsoft.DynamicsOnline.Infrastructure.Components.SharedServiceUnitStorage;
using Microsoft.Dynamics.AX.Framework.FileManagement;
public class BBReadAzureBlobStorage
{
str docfiletype;
    Microsoft.Dynamics.AX.Framework.FileManagement.IDocumentStorageProvider storageProvider;
    Public void readfromAzureBlob(DocuRef _docuRef)
    {
        AsciiStreamIo file;
        container record;
        str downloadUrl;
        if (_docuRef.isValueAttached())
        {
            var docuValueloc = _docuRef.docuValue();
            downloadUrl = docuValueloc.Path;

            if (!downloadUrl || docuValueloc.Type == DocuValueType::Others)
            {
                str accessToken = DocumentManagement::createAccessToken(_docuRef);
                downloadUrl = Microsoft.Dynamics.AX.Framework.FileManagement.URLBuilderUtilities::GetDownloadUrl(docuValueloc.FileId, accessToken);
            }
            var docContents = storageProvider.GetFile(docuValueloc.createLocation());
            file = AsciiStreamIo::constructForRead(docContents.Content);//File::UseFileFromURL(downloadUrl));
       
        }
     
        if (file)
        {
            if (file.status())
            {
                throw error("@SYS52680");
            }
            file.inFieldDelimiter(',');
            file.inRecordDelimiter('\r\n');
         
        }
     
        while (!file.status())
        {
            record = file.read();
         
            if (conLen(record))
            {
                info(strFmt("%1 - %2",conPeek(record,1),conPeek(record,2)));
            }
        }

    }

    Public boolean deletefile(DocuValue _DocuValue)
    {
        DocuValue   docuValuedel;
        DocuRef     docuRefDel;
        boolean ret = false;
        ttsbegin;
        select forupdate docuValuedel where docuValuedel.RecId == _DocuValue.RecId;
        select forupdate docuRefDel where docuRefDel.ValueRecId == docuValuedel.RecId;
        if(docuValuedel)
        {

         
            docuValuedel.delete();
            docuRefDel.delete();
            ret = true;
        }
        ttscommit;
        return ret;
    }
}

X++ code to upload a file to AZURE in D365

using Microsoft.Dynamics.ApplicationPlatform.Services.Instrumentation;
using Microsoft.DynamicsOnline.Infrastructure.Components.SharedServiceUnitStorage;
using Microsoft.Dynamics.AX.Framework.FileManagement;
public class BBAzureBlobStorage
{
str docfiletype;
    Microsoft.Dynamics.AX.Framework.FileManagement.IDocumentStorageProvider storageProvider;
 
    public void uploadfile(Filename _Filename,Filename _filePath)
    {
        guid fileGuid = newGuid();
        str fileId;
        str downloadUrl;
        System.IO.Stream    _stream;
        str fileNameAZ = strFmt('%1', _fileName);//filename = Filename.Xlsx
        fileId = guid2str(fileGuid);
        _stream = File::UseFileFromURL(_filePath);//filepath = C://Temp//Filename.Xlsx
        var blobInfo = new SharedServiceUnitStorageData();
        blobInfo.Id = fileId;
        blobInfo.Category = "AzureStorage";//Folder name
        blobInfo.Name = fileNameAZ;
        blobInfo.Accessibility = Accessibility::Private;
        blobInfo.Retention = Retention::Permanent;
     
        if (_stream.CanSeek)
        {
            _stream.Seek(0, System.IO.SeekOrigin::Begin);
        }

        var blobStorageService = new SharedServiceUnitStorage(SharedServiceUnitStorage::GetDefaultStorageContext());
        blobStorageService.UploadData(blobInfo, _stream);
        var uploadedBlobInfo = blobStorageService.GetData(fileId, "AzureStorage", BlobUrlPermission::Read, System.TimeSpan::FromDays(30));
//Time span To keep the file Azure.
        downloadUrl =uploadedBlobInfo.BlobLink;
    }
}