Java JIRA中的单文件上载

Java JIRA中的单文件上载,java,file-upload,jira,jira-plugin,Java,File Upload,Jira,Jira Plugin,我正试图在JIRA上为我的插件上传一个文件。默认的JIRA上传行为是通过Ajax上传文件并将其转换为复选框,从而允许通过一个表单type=“file”元素“上传”多个文件(参见图片) 要禁用内联附加,可以指定classignore inline attach: <form action="TestBrowse.jspa" id="upload-form" method="post" enctype="multipart/form-data"> <input t

我正试图在JIRA上为我的插件上传一个文件。默认的JIRA上传行为是通过Ajax上传文件并将其转换为复选框,从而允许通过一个表单
type=“file”
元素“上传”多个文件(参见图片)

要禁用内联附加,可以指定class
ignore inline attach

<form action="TestBrowse.jspa" id="upload-form" method="post" enctype="multipart/form-data">
        <input type="hidden" name="id" value="10000"/>
        <input type="file" name="uploadFile" class="ignore-inline-attach"/>
        <input type="submit"/>
</form>

此外,请求的enctype似乎是
application/x-www-form-urlencoded;charset=UTF-8
,尽管表单模板中明确指定了多部分/表单数据。你知道我犯了什么错误或有什么解决办法吗?

这是一个迟来的答案,但以下是我在调查一天后发现的

如果您的
位于JIRA对话框中,则使用ajax提交表单。这就是为什么请求的内容类型是
“application/x-www-form-urlencoded;”
。尝试在新浏览器选项卡中打开链接,此问题将消失。您将在服务器中收到一个
MultiPartRequestWrapper
,因为表单是正常提交的(没有ajax)

1) 扩展JIRA.FormDialog 我的第一种方法是扩展
JIRA.FormDialog
组件,用文件和其他表单输入发送
FormData
对象。这起作用了,服务器收到了一个
多部分/表单数据
请求

(编辑) 问题是将响应返回到对话框。我找不到这样做的方法。响应总是返回一个完整的带有页眉和页脚的JIRA页面,因为不知何故服务器不知道我在对话框的上下文中

我找出了问题所在。参数
inline
decorator
未被服务器删除(附加到FormData对象)。我尝试将这些参数添加到操作url中,结果成功:

   <form ... action="MyUploadAction.jspa#if($action.isInlineDialogMode())?inline=true&decorator=dialog#end"> 
2) 文件阅读器API 接下来,我尝试了
FileReader
API。当用户更改文件输入时,我读取文件并将其内容存储在DOM中。当表单通过ajax提交时,文件内容被视为普通变量。我不太喜欢这种方法,因为如果文件很大,那么网页将占用存储内容的不必要内存

3) JIRA临时文件API 最后,我尝试使用JIRA方法(删除
忽略内联附加
)在输入中输入文件时发送文件。JIRA将它们作为临时文件存储在服务器中。然后,您必须通过JIRA附件API在webwork操作中访问它们。这种方法的缺点是可以发送多个文件,但我只想发送一个文件(像您一样)

请注意,最后两种方法需要两种方法来处理服务器中的文件:1)普通的
MultiPartRequestWrapper
,因为用户仍然可以在新页面中打开对话框,并且表单不是通过ajax提交的。2) 具体做法


在解决了响应问题(如上所述)后,我最终使用了这种方法。HTH

我确认第一个解决方案有效。确保将JS代码与链接一起放在页面中,并且与JIRA的
触发器对话框相比,该链接具有CSS类
对话框触发器
   <form ... action="MyUploadAction.jspa#if($action.isInlineDialogMode())?inline=true&decorator=dialog#end"> 
var TEST = window.TEST || {};
TEST.FormDialog = JIRA.FormDialog.extend({
    _getFormDataAsObject: function() {
        var data = new FormData(this.$form[0]);
        data.append('inline', true);
        data.append('decorator', 'dialog');
        return data;
    }
});

JIRA.Dialogs.uploadFile = new TEST.FormDialog({
    id: "dialog-id",
    trigger: "a.dialog-trigger",
    ajaxOptions: JIRA.Dialogs.getDefaultAjaxOptions,        
    onSuccessfulSubmit : JIRA.Dialogs.storeCurrentIssueIdOnSucessfulSubmit,
    submitAjaxOptions: {
        type: "post",
        data: {
            inline: true,
            decorator: "dialog"
        },
        processData: false,
        contentType: false,
        mimeType: 'multipart/form-data',
        dataType: "html"
    }
});