• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Multipart/Formdata图片上传,获取文件

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:46:19 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在我的应用程序中,我想将通过 UIImagePickerController 选择的图像上传到仅接受 JPEG 图像的数据库。我在这里和其他论坛中浏览了很多问题,但我仍然没有得到它的工作。我希望你能检查我的代码,如果有我看不到的错误。 这是完整的上传方法,包括图片描述、图片标题和该图片的地理数据:

- (void) uploadPic{
    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *destinationFilePath = [[NSString alloc] initWithFormat: @"%@/%@.jpeg", documentsDirectory, self.chosenImage.imgTitle];
    NSURL *fileURL = [[NSURL alloc]initWithString:destinationFilePath];
    NSLog(@"will upload file: %@", destinationFilePath);

    NSData *imageURLdata = [[NSData alloc]initWithContentsOfURL:fileURL];   (*1) 
    NSData *imageData = UIImageJPEGRepresentation(self.chosenImage, 90);    (*2) 
    //Here i tried 2 ways of getting the data for uploading, but both don't work.

    // create the URL
    NSURL *postURL = [NSURL URLWithString"http://*********/PictureUpload"];

    // create the connection
    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:postURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];

    // change type to POST (default is GET)
    [postRequest setHTTPMethod"OST"];

    // just some random text that will never occur in the body
    NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";

    // header value, user session ID added
    NSString *headerBoundary = [NSString stringWithFormat"multipart/form-data; boundary=%@",
                                sessionID];

    // set header
    [postRequest addValue:headerBoundary forHTTPHeaderField"Content-Type"];
    // create data
    NSMutableData *postBody = [NSMutableData data];

    // title part
    [postBody appendData:[[NSString stringWithFormat"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString"Content-Disposition: form-data; name=\"title\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.imgTitle dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // desc part
    [postBody appendData:[[NSString stringWithFormat"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString"Content-Disposition: form-data; name=\"desc\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.imgDescription dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];


    // latitude part
    [postBody appendData:[[NSString stringWithFormat"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString"Content-Disposition: form-data; name=\"latitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.latitude dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // longitude part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"longitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.longitude dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // media part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.jpeg\"\r\n", self.chosenImage.imgTitle ] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[NSData dataWithData:imageURLdata]];
    [postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // final boundary
    [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    NSString *s = [[NSString alloc] initWithData:postBody encoding:NSASCIIStringEncoding];
    NSLog(@"%@", s);

    // add body to post
    [postRequest setHTTPBody:postBody];

    // pointers to some necessary objects
    NSURLResponse* response;
    NSError* error;

    // synchronous filling of data from HTTP POST response
    NSData *responseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:&response error:&error];

    if (error)
    {
        NSLog(@"Error: %@", [error localizedDescription]);
    }

    // convert data into string
    NSString *responseString = [[NSString alloc] initWithBytes:[responseData bytes]
                                                        length:[responseData length]
                                                      encoding:NSUTF8StringEncoding];

    // see if we get a welcome result
    NSLog(@"%@", responseString);
    [self responseHandler:responseString];

}

GEOimage chosenImageImagePickerController 中选择 UIImage 后通过 CGImageRef 创建。 方法编号。 *1 获取NSData 进行上传不是最好的,因为这里的图片是从文档目录中选择的,这里所有关于图片的EXIF信息都被删除了。 通过这两种方法,我从数据库中得到不支持图像文件类型的响应(预期为 JPEG)。 我想用方法nr。 *2 我正在发送 JPEG 图像,但也许我在整个 multipart/formdata 过程中有一个错误。

我试图获取文件系统上原始文件的 URL,但这对我来说非常困难。我只从图片中获得了 assets-url。

提前致谢

S4lfish



Best Answer-推荐答案


你现在可能已经自己解决了,但我想我明白你的问题了。

NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";

// header value, user session ID added
NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",
                            sessionID];

当您在 MIME header 内定义边界时,您将使用 sessionID 作为边界。然后,在下面,您将使用 stringBoundary 变量来创建实际边界。

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

提供每个 MIME block 的 Content-Length 以帮助处理代码可能也是一个好主意,但我认为这不是问题。

关于ios - Multipart/Formdata图片上传,获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8561403/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap