ken*_*nor 5 java file-upload jira jira-plugin
我正在尝试为我的插件在JIRA 上上传单个文件。JIRA的默认上载行为是通过Ajax上载文件并将其转换为复选框,从而允许通过一个表单type="file"元素“上载”多个文件(参见图片)。

要禁用内联,ignore-inline-attach可以指定class :
<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>
Run Code Online (Sandbox Code Playgroud)
但是然后,当我尝试获取MultipartRequestWrapperservlet / action中的内容时,我什么也没得到(根据各种来源,这应该是这样的方法,例如此处):
@Override
public String doExecute() throws Exception {
MultiPartRequestWrapper requestWrapper = ServletActionContext.getMultiPartRequest();
if (requestWrapper == null)
log.error("Why am I not getting a multipart wrapper?")
else {
...do something...
}
return returnCompleteWithInlineRedirect("/browse/" + getIssueObject().getKey());
}
Run Code Online (Sandbox Code Playgroud)
另外,请求的enctype似乎是application/x-www-form-urlencoded; charset=UTF-8,尽管multipart/form-data在表单模板中已明确指定。有什么想法我犯了错误或一些解决方法吗?
这是一个迟到的答案,但这是我经过一天调查后发现的结果......
如果您<input type="file">位于 JIRA 对话框中,则使用 ajax 提交表单。这就是请求的内容类型是 的原因"application/x-www-form-urlencoded;"。尝试在新的浏览器选项卡中打开链接,此问题就会消失。您将在服务器中收到一个MultiPartRequestWrapper,因为表单已正常提交(没有ajax)。
我的第一个方法是扩展JIRA.FormDialog组件以发送FormData带有文件和其他表单输入的对象。这有效并且服务器收到了multipart/form-data请求。
(编辑)
问题是返回对话框的响应。我找不到办法做到这一点。响应总是返回带有页眉和页脚的完整 JIRA 页面,因为服务器不知道我处于对话框的上下文中。
我找出问题所在了。服务器不转发的参数(附加到 FormData 对象inline)。decorator我尝试将这些参数添加到操作 URL 中,它起作用了:
<form ... action="MyUploadAction.jspa#if($action.isInlineDialogMode())?inline=true&decorator=dialog#end">
Run Code Online (Sandbox Code Playgroud)
这是代码:
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"
}
});
Run Code Online (Sandbox Code Playgroud)
接下来我尝试了FileReaderAPI。当用户更改文件输入时,我读取该文件并将其内容存储在 DOM 中。当通过 ajax 提交表单时,文件内容将被视为普通变量。我不太喜欢这种方法,因为如果文件很大,那么网页将占用这些不必要的内存来存储内容。
最后,我尝试使用 JIRA 方法(删除ignore-inline-attach)在输入中输入文件时发送文件。JIRA 将它们作为临时文件存储在服务器中。然后,您必须通过 JIRA Attachment API 在 webwork 操作中访问它们。这种方法的缺点是可以发送多个文件,但我只想发送一个文件(就像你一样)。
请注意,最后两种方法需要两种方式来处理服务器中的文件:1)正常MultiPartRequestWrapper,因为用户仍然可以在新页面中打开对话框,并且表单不是通过 ajax 提交的。2)具体的方法。
在解决响应问题(如上所述)后,我最终使用了 1) 方法。华泰