Hi list,
I am trying to use the addAttachment call to add an attachment to a page via
xmlrpc.
So far I have used groovy and python (code further down), both give me the
same error message:
xmlrpclib.Fault: <Fault 0: 'No method matching arguments: java.lang.String,
java.lang.String, java.util.HashMap, [B'>
After digging into the src I found addAttachment in:
XWikiXmlRpcClient.java (part of -core)
/**
* Add a new attachment.
*
* @param contentId Ignored. (It is here because the Confluence API signature declares
it)
* @param attachment The Attachment object describing the attachment.
* @param attachmentData The actual attachment data.
* @return An Attachment object describing the newly added attachment.
* @throws XmlRpcException
* @category ConfluenceAPI
*/
public Attachment addAttachment(Integer contentId, Attachment attachment,
byte[] attachmentData) throws XmlRpcException
{
Object object =
invokeRpc("addAttachment", token, contentId, attachment.toMap(),
attachmentData);
return (Attachment) new Attachment((Map<String, Object>) object);
}
As you can see contentId is defined as Integer not String. When using an integer
in the rpc call I get this error message:
xmlrpclib.Fault: <Fault 0: 'Failed to invoke method addAttachment in class
com.xpn.xwiki.xmlrpc.XWikiXmlRpcHandler: An XWiki id must be in the form
Space.Page[?param=value¶m=value&...]'>
When looking at the server log I can see:
Caused by:
java.lang.IllegalArgumentException: An XWiki id must be in the form
Space.Page[?param=value¶m=value&...]
at org.xwiki.xmlrpc.model.XWikiExtendedId.<init>(XWikiExtendedId.java:37)
at com.xpn.xwiki.xmlrpc.XWikiXmlRpcHandler.addAttachment(XWikiXmlRpcHandler.java:929)
...
And when looking at that method:
public XWikiExtendedId(String string)
{
if (string.indexOf(".") == -1) {
throw new IllegalArgumentException(
"An XWiki id must be in the form
Space.Page[?param=value¶m=value&...]");
}
So question is, how do I actually add an attachment to a page?
Stefan
------ python -------8<----------------------
#!/usr/bin/python
import xmlrpclib
f = open('images/foo.jpg', 'rb') #Open file as a binary file
file = f.read()
data = xmlrpclib.Binary(file) #Make the byte array
server_url = 'http://localhost:8080/xwiki/xmlrpc/confluence';
s = xmlrpclib.Server(server_url);
token = s.confluence1.login('login', 'pass');
page_list = s.confluence1.getPages(token, 'MySpace') #Get the pages in the space
new_attachment = dict(id = '', pageId = '', title = '', fileName =
'filename', fileSize = '', contentType = 'content type', created =
'', creator = '', url = '', comment = 'Some comment')
#Make a attachment container
for page in page_list:
if page['title'] == 'AttachMe':
s.confluence1.addAttachment(token, page['id'], new_attachment, data)
------ python ------->8----------------------
------ groovy -------8<----------------------
import groovy.net.xmlrpc.XMLRPCServerProxy
import java.io.File
server = "localhost:8080";
username = "user";
password = "pass";
serverProxy = new XMLRPCServerProxy("http://${server}/xwiki/xmlrpc/confluence")
try {
println "Logging in...";
token = serverProxy.confluence1.login(username, password)
} catch (Exception e) {
println "Cannot login! Check username or password..."
throw e;
}
println "Logged in";
try {
def attach = [:];
# load file with PAGENAME<SPACE>IMAGETOATTACH per line
println "Loading image list";
new File("images.txt").eachLine { line ->
array = line.split(" ");
attach.put(array[0], array[1]);
attachment = [id : '', pageId : '', title : '', fileName :
'filename', fileSize : '', contentType : 'content type', created :
'', creator : '', url : '', comment : 'Some comment'];
bytes = new File(array[1]).readBytes();
page = serverProxy.confluence1.getPage(token, "MySpace.${array[0]}");
serverProxy.confluence1.addAttachment(token, page.id, attachment, bytes);
}
} finally {
serverProxy.confluence1.logout(token);
}
------ groovy ------->8----------------------
regards
Stefan
--
I did it just to piss you off. :-P
-- Branden Robinson in a message to debian-devel