Sure, the here's a Java code snippet. Unfortunately, the .NET side is a black 
box to me, so I don't have any code to share. This will take the code generated 
by WSDL2Java and pull out the attachments from the "content" field which is 
typed as an xsd:anyType:

    public static byte[] convertToBytes(NodeDocument doc)
    {
        Object content = null;
        byte dataOUT[] = null;
        content = doc.getContent();
        if(content instanceof byte[])
            dataOUT = (byte[])content;
        else
        if(content instanceof DataHandler)
        {
            DataHandler dhData = (DataHandler)content;
            dataOUT = getBytesFromStream(dhData);
        } else
        if(content instanceof AttachmentPart)
        {
            AttachmentPart attch = (AttachmentPart)content;
            dataOUT = getBytesFromStream(attch.getActivationDataHandler());
        } else
        {
            throw new IllegalArgumentException("Could not convert to bytes 
from: " + content + " Argument type is unknown!");
        }
        return dataOUT;
    }

    private static byte[] getBytesFromStream(DataHandler data)
    {
        InputStream in = null;
        byte out[] = null;
        try
        {
            in = data.getInputStream();
            if(in != null)
            {
                out = new byte[in.available()];
                in.read(out);
            } else
            {
                out = new byte[0];
            }
        }
        catch(IOException ex)
        {
            System.err.println("Could not get Bytes.");
            ex.printStackTrace();
        }
        return out;
    }

>>> [EMAIL PROTECTED] 01/07/05 03:30PM >>>
Does it mean that the following method should work fine if I change DataHandler 
to Object? Does it work w/o any changes in the method implementation?

public String createOrUpdateContentObjectWithAttachments(String sessionID,
   String containerID, String xmlString, String customerID,  String contentID, 
DataHandler source, String sourceFileName,
   DataHandler thumb, String thumbFileName);

input argument DataHandler is sent stream. How would the client and server know 
that it has to send the stream for that specific argument. You are just sending 
xsd:AnyType.

Andy, do you mind sending your code. Or atleast the snippet of the method that 
takes attachment as input argument?. I would appreciate if could also send your 
.NET snippet.

Thannks
Praveen

----- Original Message ----- 
From: "ANDREW MICONE" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, January 07, 2005 5:22 PM
Subject: RE: Best way to send attachments


Right, it's passed in either directly or by reference as xsd:anyType and then 
the receiver has to type the anyType to determine whether its base64encoded, 
SwA, or DIME. -- Andy

>>> [EMAIL PROTECTED] 01/07/05 03:10PM >>>
Nothing in that wsdl fragment indicates that there will be any MIME or
DIME based attachments.

Cheers
Simon 

> -----Original Message-----
> From: ANDREW MICONE [mailto:[EMAIL PROTECTED] 
> Sent: Friday, January 07, 2005 12:14 PM
> To: [EMAIL PROTECTED] 
> Subject: RE: Best way to send attachments
> 
> Here's an example of a WSDL snippet that is consumed by both 
> .NET and Axis that handles attachments and interoperates 
> between the two. This is from a service in production:
> 
> <complexType name="NodeDocument">
> <sequence>
> <element name="name" nillable="true" type="xsd:string"/>
> <element name="type" nillable="true" type="xsd:string"/>
> <element name="content" nillable="true" 
> type="xsd:anyType"/>
> </sequence>
> </complexType>
> <complexType name="ArrayofDoc">
> <complexContent>
> <restriction base="soapenc:Array">
> <attribute ref="soapenc:arrayType" 
> wsdl:arrayType="tns1:NodeDocument[]"/>
> </restriction>
> </complexContent>
> </complexType>
> 
> BTW, I didn't write it, I just implemented it. -- Andy
> 
> >>> [EMAIL PROTECTED] 01/07/05 12:26PM >>>
> I don't believe there is a way to define this in wsdl so that 
> both .Net and Java(axis) can consume the wsdl. Someone please 
> correct me if I am wrong. My clients just have to understand 
> that certain methods have filles attached. I also allow them 
> to set a request parameter do define whether the attachment 
> should be set to Dime or Mime encoding (the service is Axis).
> 
> 
> Raul
> 
> -----Original Message-----
> From: BLIS Webmaster (Patrick Houbaux)
> [mailto:[EMAIL PROTECTED] 
> Sent: Friday, January 07, 2005 1:12 PM
> To: [EMAIL PROTECTED] 
> Subject: Re: Best way to send attachments
> 
> I have no problem sending attachements to .NET client.
> 
> I have a RPC web service (I guess it works for other web 
> service style), and here is the methodologie:
> 
> Let's assume you have a web service supposed to send some 
> attachments, the idea is to add the attachment to the SOAP 
> message before the web service method returns on the server 
> side (please note the following is using AXIS 1.1, but it is 
> almost the same with the latest version of AXIS, the AXIS API 
> has changed a bit).
> 
> 1- get the response message from the message context:
> //... 
> org.apache.axis.MessageContext msgContext= 
> org.apache.axis.MessageContext.getCurrentContext();
> org.apache.axis.Message rspMsg= msgContext.getResponseMessage();
> 
> 2 - Set the attachment type to be sent as DIME
>  
> 
> rspMsg.getAttachmentsImpl().setSendType(org.apache.axis.attach
> ments.Atta
> chments.SEND_TYPE_DIME);
> 
> 3- Let's assume you want to send a file
> 
>         java.io.File fileToAddAsAttachment = new 
> java.io.File("<the path to your file>");
> 
> 4- Add the file to attachment of the response message
> 
> javax.activation.DataHandler dh=new
> javax.activation.DataHandler(new
> javax.activation.FileDataSource(fileToAddAsAttachment));
> org.apache.axis.attachments.AttachmentPart part = new 
> org.apache.axis.attachments.AttachmentPart(dh);
>         rspMsg.addAttachmentPart(part);
> 
> 5- Return your method
> 
> The drawback with that is I haven't figured out how to declare (with
> java2wsdl) the attachment in the WSDL so you have to document 
> your web service or inform your clients they have to expect 
> some attachments when they call your method.
> 
> On the .NET client side, the method is the following:
> 
> 1- Call the web service method
> 
> 2- Just after the previous call returned, get the SOAP 
> Response message context
> SoapContext rspContext = service.ResponseSoapContext;
> 
> 3- Get the DIME attachements, loop on them and write in a 
> file what you find there:
>         DimeAttachmentCollection attachments = rspContext.Attachments;
> for (int i=0; i<attachments.Count; i++)
> {
> Stream str = attachments[i].Stream;
> FileStream fs = new FileStream("<the file name 
> where you want to save the 
> attachment>",FileMode.Create,FileAccess.Write);
> ((MemoryStream)str).WriteTo(fs);
> str.Close();
> fs.Close();
> }
> 
> That's all, that works perfectly for me ... hope it helps.
> 
> Cheers,
> Patrick.
> 
> 
> 
> Vy Ho wrote:
> > All of the reples make no sense whatsover to me.
> > 
> > The original poster makes a very clear question that how to send 
> > attachments using soap way that works with many environments.  For 
> > example, Axis and .Net.
> > 
> > To rephrase this, I would say how to create a Wsdl that works with 
> > both axis and .net.  Currently, using the DataHandler in 
> the wsdl (or 
> > generating the wsdl from java code with DataHandler) would not work 
> > with other environment.  I haven't tried this, but looking at the 
> > definition of DataHandler (package name), and its namespace in the 
> > wsdl, you can tell it comes from apache, not some Soap standard, 
> > unless Apache is the official standard used for attachment.
> > 
> > It's funny to read a bunch of replies that have little 
> answer value to
> 
> > the original question.
> 
> 

Reply via email to