2 votes

Télécharger des données vers le service wcf avec AFNetworking ? Enfin, ça marche ! (contient les codes c# et obj-c)

Je travaille sur un projet qui nécessite de télécharger des fichiers de l'iphone vers le service wcf. je n'ai pas d'expérience à la fois sur wcf et afnetworking. je suis resté bloqué sur cette étape pendant des jours et voici les progrès que j'ai fait :

Service WCF pour le téléchargement de fichiers : notez que j'ai copié ce code à partir de Site web du Codeproject .

public interface ITransferService
{
[OperationContract]
RemoteFileInfo DownloadFile(DownloadRequest request);

[OperationContract]
 void UploadFile(RemoteFileInfo request); 
}

    public void UploadFile(RemoteFileInfo request)
{
    FileStream targetStream = null;
    Stream sourceStream =  request.FileByteStream;

    string uploadFolder = @"C:\upload\";

    string filePath = Path.Combine(uploadFolder, request.FileName);

    using (targetStream = new FileStream(filePath, FileMode.Create, 
                          FileAccess.Write, FileShare.None))
    {
        //read from the input stream in 65000 byte chunks

        const int bufferLen = 65000;
        byte[] buffer = new byte[bufferLen];
        int count = 0;
        while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0)
        {
            // save to output stream
            targetStream.Write(buffer, 0, count);
        }
        targetStream.Close();
        sourceStream.Close();
    }

}

Le code de téléchargement fonctionne bien sur le programme client fourni avec le code source, je peux télécharger n'importe quelle taille et n'importe quel type de fichier via le service wcf.

J'ai aussi trouvé que le framework AFNetworking est assez populaire sur ios, donc j'ai décidé de l'utiliser. Voici mon code pour télécharger un fichier :

je suis venu jusqu'ici, s'il vous plaît aidez-moi dans cette situation. merci de m'aider

OK, voici les nouvelles informations :

Frst de tous, le code c# pour télécharger le fichier vers le service wcf (qui fonctionne)

protected void Button1_Click(object sender, EventArgs e)
{ 
if (FileUpload1.HasFile)
{
    System.IO.FileInfo fileInfo = 
           new System.IO.FileInfo(FileUpload1.PostedFile.FileName);
    FileTransferServiceReference.ITransferService clientUpload = 
           new FileTransferServiceReference.TransferServiceClient();
    FileTransferServiceReference.RemoteFileInfo 
           uploadRequestInfo = new RemoteFileInfo();

    using (System.IO.FileStream stream = 
           new System.IO.FileStream(FileUpload1.PostedFile.FileName, 
           System.IO.FileMode.Open, System.IO.FileAccess.Read))
    {
        uploadRequestInfo.FileName = FileUpload1.FileName;
        uploadRequestInfo.Length = fileInfo.Length;
        uploadRequestInfo.FileByteStream = stream;
        clientUpload.UploadFile(uploadRequestInfo);
        //clientUpload.UploadFile(stream);
    }
}
}

Deuxièmement : Le site remotefileinfo qui est utilisée pour télécharger le fichier vers le serveur :

  public class RemoteFileInfo : IDisposable
  {
    [MessageHeader(MustUnderstand = true)]
     public string **FileName**;

    [MessageHeader(MustUnderstand = true)]
    public long **Length**;

    [MessageBodyMember(Order = 1)]
    public System.IO.Stream **FileByteStream**;

    public void Dispose()
    { 
        if (FileByteStream != null)
       {
        FileByteStream.Close();
        FileByteStream = null;
       }
    }   
  }

De tous ces codes, je comprends que je dois créer une requête qui contient "Filename" "FileLength" et le fichier "FileByteStream". J'ai essayé quelque chose dans les codes mais le serveur donne l'erreur 415 quand j'essaie de télécharger une image avec ce code :

   AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://192.168.2.121:85"]];

UIImage *image = [UIImage imageNamed:@"test.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 0.2);

NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setObject:@"test.jpg" forKey:@"FileName"];
[parameters setObject:[NSString stringWithFormat:@"%i",data.length] forKey:@"Length"];

NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/webservice/Transferservice.svc/UploadFile" parameters:parameters constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithFileData:data name:@"RemoteFileInfo" fileName:@"test.jpg" mimeType:@"image/jpeg"];
}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:myRequest];
[operation 
 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
     NSLog(@"success: %@", operation.responseString);
 } 
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"error: %@", operation.error);
 }
 ];

[[[NSOperationQueue alloc] init] addOperation:operation];

Voici également le lien WSDL pour le service :

Lien WSDL

J'ai vraiment besoin de faire ça, merci encore de m'aider...

3voto

iamsmug Points 731

Essayez ceci pour la taille :

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://192.168.2.121:85"]];

NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"test.jpg"], 0.2);

NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" path:@"/webservice/Transferservice.svc/UploadFile" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithFileData:data name:@"RemoteFileInfo" fileName:@"test.jpg" mimeType:@"image/jpeg"];
}];

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:myRequest] autorelease];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObj) {
    NSLog(@"success: %@", operation.responseString);
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
    NSLog(@"[Error]: (%@ %@) %@", [operation.request HTTPMethod], [[operation.request URL] relativePath], operation.error);
}];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];

Vous ne devriez pas avoir besoin de transmettre le nom de votre fichier ou la taille dans vos paramètres de post, vous pouvez les récupérer sur le formulaire de réception. N'oubliez pas que la partie "nom" de la balise appendPartWithFileData doit être utilisé par votre script côté serveur pour identifier le téléchargement du fichier.

Tout ce qui précède est pertinent en PHP, mais devrait fonctionner de la même manière en ASP.NET.

Comme ci-dessus, le lien ne fonctionne pas.

Cheers

1voto

dreampowder Points 692

Finalement, j'ai réussi à télécharger un fichier vers WCF via filestream. Le problème était que le code précédent attendait un en-tête et un flux dans le corps, ce que je n'ai pas trouvé le moyen de faire. Au lieu de cela, j'ai trouvé que j'ai besoin d'écrire un code qui n'accepte qu'un flux comme paramètre, rien de plus, et puis le nom de fichier et d'autres choses seront faites au niveau du serveur.

J'ai obtenu ce code de téléchargement pour le service wcf à partir de cette question : Service WCF pour accepter un post encodé multipart/form-data

j'ai fait exactement ce qui est écrit dans la réponse. et dans le côté iphone, j'ai configuré un flux d'entrée pour mon opération. voici le code pour l'AFNetworking pour télécharger des fichiers vers le service wcf :

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://192.168.2.121:85"]];

UIImage *image = [UIImage imageNamed:@"test.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 0.2);
NSInputStream *stream = [[[NSInputStream alloc]initWithData:data] retain];
NSDictionary *parameters = nil;

NSMutableURLRequest *myRequest = [client requestWithMethod:@"POST" path:@"/uploadservice/service1.svc/Upload" parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:myRequest];

 [
 operation 
 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
     NSLog(@"success: %@", operation.responseString);
 } 
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"error: %@", operation.error);
 }
 ];

operation.inputStream = stream; //Thats where you put your stream!

[[[NSOperationQueue alloc] init] addOperation:operation];

Merci à tous pour leur patience, même vos réponses n'étaient pas la réponse complète, vos réponses m'ont conduit aux bonnes réponses...

0voto

JosephH Points 21074

Vous obtenez une erreur 404, ou "Not found", du serveur web distant.

Cela signifie probablement que le chemin d'accès à l'URL ou le nom du serveur est incorrect. Il n'y a pas assez d'informations sur la configuration côté serveur pour que nous puissions en déduire l'URL correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X