You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetSuite自定义页面Excel文件上传后大小为0问题求助

NetSuite Excel文件上传后大小为0的问题解决

问题现象

自定义Suitelet页面实现Excel文件上传,界面提示上传成功,但在文件柜中查看时文件大小始终为0,打开文件提示损坏。通过log.debug验证,上传前文件的大小是准确的,怀疑是代码逻辑或文件权限问题。

原代码

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 */
define(["N/ui/serverWidget", "N/file"], function (ui, file) {
  function onRequest(context) {
    if (context.request.method === "GET") {
      var form = ui.createForm({ title: "Upload Excel File" });
      var fileField = form.addField({
        id: "custpage_file",
        type: ui.FieldType.FILE,
        label: "Choose an Excel file",
      });
      form.addSubmitButton("Upload");
      context.response.writePage(form);
    } else {
      var uploadedFile = context.request.files.custpage_file;
      log.debug("File Name:", uploadedFile.name);
      log.debug("File Size:", uploadedFile.size);
      

      var fileObj = file.create({
        name: uploadedFile.name,
        fileType: file.Type.EXCEL, // Explicitly set the fileType
        content: uploadedFile.getContents(),
        folder: 5034,
      });
      var fileId = fileObj.save();
      context.response.write("File uploaded successfully with ID: " + fileId);
      log.debug("Uploaded file type:", uploadedFile.fileType);
    }
  }

  return {
    onRequest: onRequest,
  };
});

问题原因

  1. 二进制内容处理错误:Excel文件是二进制格式,原代码中使用uploadedFile.getContents()方法获取内容,该方法仅适用于文本类文件(如CSV、TXT),读取二进制文件会导致内容丢失,最终保存的文件大小为0。
  2. 权限验证(次要):需要确认Suitelet的执行角色拥有目标文件夹(ID 5034)的写入权限,否则可能导致文件保存不完整。

修复方案

方案1:使用getBytes()处理二进制内容

将getContents()替换为getBytes(),并修正file.create的参数名(NetSuite 2.x API中参数为contents而非content):

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 */
define(["N/ui/serverWidget", "N/file"], function (ui, file) {
  function onRequest(context) {
    if (context.request.method === "GET") {
      var form = ui.createForm({ title: "Upload Excel File" });
      var fileField = form.addField({
        id: "custpage_file",
        type: ui.FieldType.FILE,
        label: "Choose an Excel file",
      });
      form.addSubmitButton("Upload");
      context.response.writePage(form);
    } else {
      var uploadedFile = context.request.files.custpage_file;
      log.debug("File Name:", uploadedFile.name);
      log.debug("File Size:", uploadedFile.size);

      // 用getBytes()获取二进制内容,参数名修正为contents
      var fileObj = file.create({
        name: uploadedFile.name,
        fileType: file.Type.EXCEL,
        contents: uploadedFile.getBytes(),
        folder: 5034,
      });
      var fileId = fileObj.save();
      context.response.write("File uploaded successfully with ID: " + fileId);
      log.debug("Uploaded file type:", uploadedFile.fileType);
    }
  }

  return {
    onRequest: onRequest,
  };
});

方案2:直接使用copyToFolder方法(更简洁)

利用file.File对象的copyToFolder方法,直接将上传的文件复制到目标文件夹,避免手动创建文件对象:

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 */
define(["N/ui/serverWidget", "N/file"], function (ui, file) {
  function onRequest(context) {
    if (context.request.method === "GET") {
      var form = ui.createForm({ title: "Upload Excel File" });
      var fileField = form.addField({
        id: "custpage_file",
        type: ui.FieldType.FILE,
        label: "Choose an Excel file",
      });
      form.addSubmitButton("Upload");
      context.response.writePage(form);
    } else {
      var uploadedFile = context.request.files.custpage_file;
      log.debug("File Name:", uploadedFile.name);
      log.debug("File Size:", uploadedFile.size);

      // 直接复制到目标文件夹
      var fileId = uploadedFile.copyToFolder({
        folder: 5034
      });
      context.response.write("File uploaded successfully with ID: " + fileId);
      log.debug("Uploaded file type:", uploadedFile.fileType);
    }
  }

  return {
    onRequest: onRequest,
  };
});

额外验证

  • 检查执行Suitelet的角色权限:确保该角色对文件夹ID 5034有编辑/写入权限
  • 验证文件类型:若上传的是.xlsx格式,可将file.Type.EXCEL改为file.Type.EXCELX,确保文件类型匹配

内容的提问来源于stack exchange,提问作者RogerYueh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:33:20