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 :
J'ai vraiment besoin de faire ça, merci encore de m'aider...