私はiphoneからwcfサービスにファイルをアップロードする必要があるプロジェクトに取り組んでいます。私はwcfとafnetworkingの両方の経験がありません。私は何日もこのステップに固執してきました、そしてここに私が成し遂げた進歩があります:
ファイルをアップロードするためのWCFサービス:このコードをCodeprojectWebサイトからコピーしたことに注意してください。
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();
}
}
アップロードコードは、sourcodeに付属しているクライアントプログラムで適切に機能します。wcfサービスを介して、任意のサイズ、任意のタイプまたはファイルをアップロードできます。
また、AFNetworkingフレームワークはiOSで非常に人気があることがわかったので、それを使用することにしました。ファイルをアップロードするための私のコードは次のとおりです。
私はここまで来ました、この状況で私を助けてください。助けてくれてありがとう
OK、ここに新しい情報があります:
まず第一に、ファイルをwcfサービス(動作している)にアップロードするためのc#コード
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);
}
}
}
2番目:ファイルをサーバーにアップロードするために使用されたremotefileinfoクラス:
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;
}
}
}
これらすべてのコードから、「Filename」「FileLength」とfiledata「FileByteStream」を含むリクエストを作成する必要があることを理解しています。コードで何かを試しましたが、このコードで画像をアップロードしようとすると、サーバーでエラー415が発生します。
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];
サービスのWSDLリンクもここにあります:
私は本当にこれをする必要があります、もう一度助けてくれてありがとう...