无法通过 NetSuite 中的在线 HTML 表单将文件(jpeg、png、pdf 等)上传到文件柜/自定义记录

Unable to Upload file(jpeg, png, pdf etc) into File cabinet / custom record through online HTML form in NetSuite

问题:

我在 NetSuite 中对从 Shopify 获取的在线表格进行自定义记录时遇到问题,这是因为我无法将附件或文件上传到文件柜。

尝试过:

我尝试将文件或附件转换为 base64 并也通过 blob 转换,但无法获得所需的结果,因为 Netsuite 有限制,它不能处理超过 1000 个字符,这也不是一个好的解决方法,因为用户有更新图像的权限。

代码中:

创建了在线 HTML 表单并将其字段与其相关字段映射,并为每条记录创建自定义记录,我成功地映射了除附件(.png、.pdf、 .png 等)

是否有任何方法可以获得结果,即通过在线 HTML 表格或任何其他解决方法成功创建自定义记录以获得结果?

据我所知,文件柜不能用于在线表格。

作为解决方法,您可以让 Shopify "receive" 文件,然后对其进行编码以通过自定义电子邮件捕获插件将文件发送到 NetSuite。

将正确的数据放在主题行上,以便您的捕获脚本知道将文件放在哪里。

因为,现在无论我检查或搜索有关上传图片的内容,也许我们无法将图片上传到他们各自的领域,除非我们将特定文件保存到文件柜中。

因此,我选择了一些其他方法,即通过 suitelet 然后 POST 将文件存储在文件柜中的相应字段后,使用相同的表格。

这是我的解决方法代码:

var dataBody = JSON.parse(request.getBody());
nlapiLogExecution("debug", "POST BLOCK", 'dataBody = ' + JSON.stringify(dataBody));
var file_folder = '2442342';
var contents = dataBody.imgdata;
var fileType = dataBody.fileType;
var date = new Date();
var newDate = date.getMilliseconds() + date.getTime();
var type = '';
var ext = '';
if ((fileType == 'plain') || (fileType == 'PLAIN')) {
    type = 'PLAINTEXT';
    ext = 'txt';
}
if ((fileType == 'pdf') || (fileType == 'PDF')) {
    type = 'PDF';
    ext = 'pdf';
}
if ((fileType == 'png') || (fileType == 'PNG')) {
    type = 'PNGIMAGE';
    ext = 'png';
}
if ((fileType == 'jpeg') || (fileType == 'JPEG')) {
    type = 'JPGIMAGE';
    ext = 'jpeg';
}
if ((fileType == 'jpg') || (fileType == 'JPG')) {
    type = 'JPGIMAGE';
    ext = 'jpg';
}

var name = newDate + '.' + ext;
nlapiLogExecution("debug", "POST BLOCK", 'File Type: ' + type);
try {
    if (type) {
        var uploadFile = nlapiCreateFile(name, type, contents);
        uploadFile.setFolder(file_folder);
        var FileId = nlapiSubmitFile(uploadFile);
        nlapiLogExecution("debug", "POST BLOCK", 'Image File ID: ' + FileId);
    }
    if (FileId) {
        warr.setFieldValue('custrecord_file_id', FileId);
    }
} catch (err) {
    nlapiLogExecution("debug", "POST BLOCK", 'Error: ' + err);
}

希望对其他人有所帮助。还有一件事你需要在保存文件柜时解密数据,但如果你将文件类型全部更改为 jpg 图像,那么你可能不需要转换它。 谢谢

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 * @NModuleScope SameAccount
 */
define(['N/ui/serverWidget', 'N/record', 'N/runtime', 'N/file', 'N/log'],

function(serverWidget, record, runtime, file, log) {

    /**
     * Definition of the Suitelet script trigger point.
     *
     * @param {Object} context
     * @param {ServerRequest} context.request - Encapsulation of the incoming request
     * @param {ServerResponse} context.response - Encapsulation of the Suitelet response
     * @Since 2015.2
     */
    function onRequest(context) {
        if(context.request.method === 'GET'){
            var formObj = serverWidget.createForm({
                title: 'Attach Multiple Files'
            });

            var userId = runtime.getCurrentUser().id;

            //User Name
            var user = formObj.addField({
                id: 'custpage_suitelet_user',
                type: serverWidget.FieldType.SELECT,
                source: 'employee',
                value: userId,
                label: 'USER'
            });
            user.defaultValue = userId;

            //File fields
            formObj.addField({
                id: 'custpage_suitelet_file1',
                type: serverWidget.FieldType.FILE,
                label: 'File 1'
            });
            formObj.addField({
                id: 'custpage_suitelet_file2',
                type: serverWidget.FieldType.FILE,
                label: 'File 2'
            });
            formObj.addField({
                id: 'custpage_suitelet_file3',
                type: serverWidget.FieldType.FILE,
                label: 'File 3'
            });

            formObj.addSubmitButton({label: 'Submit'});
            formObj.addResetButton({label: 'Reset'});

            context.response.writePage(formObj);
        }
        else{
            var userId = runtime.getCurrentUser().id;

            var file1 = context.request.files['custpage_suitelet_file1'];
            var file2 = context.request.files['custpage_suitelet_file2'];
            var file3 = context.request.files['custpage_suitelet_file3'];

            file1.folder = 624; //folder internal ID
            file2.folder = 624; //folder internal ID
            file3.folder = 624; //folder internal ID

            var id1 = file1.save();
            var id2 = file2.save();
            var id3 = file3.save();

            record.attach({
                record: {
                    type: 'file',
                    id: id1
                },
                to: {
                    type: 'employee',
                    id: userId
                    }
            });
            record.attach({
                record: {
                    type: 'file',
                    id: id2
                },
                to: {
                    type: 'employee',
                    id: userId
                    }
            });
            record.attach({
                record: {
                    type: 'file',
                    id: id3
                },
                to: {
                    type: 'employee',
                    id: userId
                    }
            });

            var formObj = serverWidget.createForm({
                title: 'File/s attached!'
            });
            context.response.writePage(formObj);
        }
    }

    return {
        onRequest: onRequest
    };

});

我从 SuiteAnswers 获取脚本。它适用于 NS 脚本的第二版。 suitelet 可以通过 iframe 使用。您可以直接将文件附加到记录 and/or 填充 custrecord_file_id。如果您的存储空间有限 space,这不是最佳做法。

在我的案例中,return/repair form 客户应上传损坏产品的视频或图片。我使用 "google script" 将文件上传到 google 驱动器,并且我 post 仅通过 Suitelet URL 到 Netsuite。