且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

POST SQLITE 文件到远程服务器

更新时间:2023-02-02 17:58:54

使用 multipart/form-data 作为标题 Content-TypeContent-Type: application/octet-stream 用于 HTTP 正文中的文件.

Use multipart/form-data for header Content-Type, and Content-Type: application/octet-stream for a file in HTTP body.

好的,我将向您展示一个演示,只需使用模板空应用程序"创建一个新的 Xcode 项目,选中使用 ARC",然后粘贴:

OK, I will show u a demo, just create an new Xcode project with template 'Empty Application', check 'Use ARC', then paste :

#import "AppDelegate.h"

@interface AppDelegate ()
@property (nonatomic, strong) NSURLConnection *urlConnection;
@property (nonatomic, strong) NSMutableData *receivedData;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        [self.window makeKeyAndVisible];
        NSString *localFile = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
                                objectAtIndex:0] stringByAppendingPathComponent:@"user.sqlite"];
        NSString *api = @"http://192.168.0.170/test/upload/upload.php";
        [self sendFile:localFile toServer:api];
        return YES;
}

- (void)sendFile:(NSString *)filePath toServer:(NSString *)serverURL
{
        NSData *fileData = [NSData dataWithContentsOfFile:filePath];
        if (!fileData) {
                NSLog(@"Error: file error");
                return;
        }

        if (self.urlConnection) {
                [self.urlConnection cancel];
                self.urlConnection = nil;
        }

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                        initWithURL:[NSURL URLWithString:serverURL]];
        [request setTimeoutInterval:30.0];
        [request setHTTPMethod:@"POST"];
        NSString *boundary = @"780808070779786865757";

        /* Header */
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
        [request addValue:contentType forHTTPHeaderField:@"Content-Type"];

        /* Body */
        NSMutableData *postData = [NSMutableData data];
        [postData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [postData appendData:[[NSString stringWithFormat:@"Content-Disposition:form-data; name=\"file\"; filename=\"test.sqlite\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [postData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [postData appendData:fileData];
        [postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [request setHTTPBody:postData];

        self.urlConnection = [NSURLConnection connectionWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
        if (self.receivedData) {
                self.receivedData = nil;
        }
        self.receivedData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
        [self.receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
        NSLog(@"finish requesting: %@", [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]);
        self.urlConnection = nil;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
        NSLog(@"requesting error: %@", [error localizedDescription]);
        self.urlConnection = nil;
}

@end

和服务器端,php:

<?php

$uploaddir = './uploads/';

if(!file_exists($uploaddir)) @mkdir($uploaddir);
$file = basename($_FILES['file']['name']);
$uploadfilename = rand() . '-' . $file;
$uploadfile = $uploaddir . $uploadfilename;
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
        $fileURL = "http://192.168.0.170/test/upload/uploads/{$uploadfilename}";
        // echo '<a href=' . $fileURL . '>' . $fileURL . '</a>';
        $jsonArray = array( 
                'status' => 1,
                'url' => $fileURL, 
        );
        echo json_encode($jsonArray);
} else {
        echo json_encode( array( 'status' => -1 ) );
}