salve a tutti. sto utilizzando xmlrpc di services. ho riuscito a far comunicare un mio programma sritto in java cn drupal.
riesco a creare un nodo ed aggiungere un contenuto. non riesco a capire come posso allegare un file.
qualcuno sa aiutarmi!?
grazieeee :)
drupal xmlrpc(services)
Gio, 30/09/2010 - 17:31
#1
drupal xmlrpc(services)
Questo esempio in Python forse aiuta: http://drupal.org/node/687116
Più imparo, più dubito.
ho provato a darci uno sguardo... ma non è molto chiaro :) non sapresti darmi qualche dritta per il java?
Se conosci Java, il codice Python non è così difficile da leggere...
Devi fare due operazioni:
1. Salvare il file, col servizio 'file.save' e tenere il fid restituito
2. Aggungere il fid nel array files del nodo, e salvare il nodo col servizio 'node.save'
Il codice in http://drupal.org/node/632844 ha una classe Java, ma la funzione fileSave() - come dice il comment - è completamente inutilizzabile.
Per capire cosa pretende il servizio 'file.save', guarda qui: http://drupalcode.org/viewvc/drupal/contributions/modules/services/servi... la funzione è file_service_save().
Ad una prima occhiata mi sembra che vuole:
file: dati del file codificato base64
filepath: indirizzo del file sul server, quindi sites/default/files/ + altro se necessario + il filename
Il codice Python è stato molto più completo (anche se il servizio butta via la gran parte di questo informazione):
## Load a movie file
filename = 'testfile.MOV'
filesize = os.stat(filename).st_size
filemime = mimetypes.guess_type(filename)
fd = open(filename, 'rb')
video_file = fd.read()
fd.close()
# Create a file_obj dict with encoded file data
file_obj = {
'file': base64.b64encode(video_file),
'filename': filename,
'filepath': 'sites/default/files/' + filename,
'filesize': filesize,
'timestamp': timestamp,
'uid': user['uid'],
'filemime': filemime,
}
Per capire la proprietà files di un nodo, ho guardato con devel e kpr(), comunque troverai il codice in upload_save() includes/upload.module, essenzialmente è un array di chiavi e valori:
fid => array(
'fid' => fid, // mentalità $P->H->P fid => [ 'fid' => fid ], sigh
'new' => 1, // perche è nuovo
'list' => 1, // se vuoi che appare nella lista, altrimenti 0
'description' => "qualsiasi testo, ma di solito il nome-del-file",
'weight' => 0,
);
}
Anche qui, il codice Python è più che corretto:
# Create the node object and reference the new fid just created
node = {
'type': 'video_local',
'status': 1,
'type': 'video_local',
'title': 'Remote Test ' + timestamp,
'body': 'This is a test created from a remote app',
'uid': user['uid'],
'name': user['name'],
'changed': timestamp,
'files': { f: {
'new': 1, # Required to insert the referenced file->fid as new attachment!
'fid': f, # f is fid from uploaded video file
'list': 1, # Or 1, depending on whether you want the attachment listed on node view.
'description': 'Video File', # Any text description
'weight': 0,
}
},
'field_video_overlay' : [
{'value': 'CCK Text Goes Here'},
],
}
mentre il codice Java è un pò lontano - dato che non prevede una proprietà 'files'. Sigh.
HTH
John
Più imparo, più dubito.
quindi dovrei riscrivere la funzione fileSave() che si trova in http://drupal.org/node/632844 oppure posso utilizzare quella per salvare il file?
quindi dovrei riscrivere la funzione fileSave() che si trova in http://drupal.org/node/632844 oppure posso utilizzare quella per salvare il file?
Uhm, no. Quella funzione è lampantemente rotto.
TODO: Leo says: This does not conform to the Drupal interface of file.save
Infatti manca filename per esempio...
Secondo me, anche la classe è rotto. Almeno concettualmente. But I digress...
La "Java way" non è particolarmente adatto ad un problema del genere. Da una parte hai un linguaggio rigido, dall'altra un linguaggio flessibile...
Personalmente userei dei Hashmap, e non mi metto a creare un tot di classe (che ereditano Hashmap) per mappare quello che in PHP (array o oggetto) è facilmente definibile con un semplice Hashmap in Java (node, file, ecc). Puro eresia nel mondo Java, naturalmente, ma è divertente essere eretico qualche volta.
L'esempio in Groovy (non particolarmente brillante - for () invece di hash.each { }) è comunque molto più leggibile http://drupal.org/node/132809 proprio perchè più vicino al tipo di linguaggio del server.
HTH
John
Più imparo, più dubito.
intanto ti ringrazio per le rispote, gentilissimo... certo che è un bel casino... dovrei cercare di riscrivere quella funzione allora