问题
I am trying to upload an image to a web service from an iPhone, but even though the file is successfully uploaded, the jpg cannot be viewed, it seems corrupt.
A file can be successfully uploaded and working fine using this c# code:
var url = http://myurl.co.uk/services/service.svc/UploadImage?id=108&ext=png;
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "POST";
req.ContentType = "image/jpeg";
using (var reqStream = req.GetRequestStream())
{
var bytes = File.ReadAllBytes("C:\\Users\\Chris\\Pictures\\default.png”);
reqStream.Write(bytes, 0, bytes.Length);
}
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
Yet this is the code i'm trying on iOS that leaves the file un-viewable:
Get image
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// Resize the image from the camera
UIImage *scaledImage = [image resizedImageWithContentMode:UIViewContentModeScaleAspectFill bounds:CGSizeMake(_photo.frame.size.width/2, _photo.frame.size.height/2) interpolationQuality:kCGInterpolationHigh];
// Crop the image to a square (yikes, fancy!)
UIImage *croppedImage = [scaledImage croppedImage:CGRectMake((scaledImage.size.width -_photo.frame.size.width)/2, (scaledImage.size.height -_photo.frame.size.height)/2, _photo.frame.size.width, _photo.frame.size.height)];
// Show the photo on the screen
_photo.image = croppedImage;
NSData *imgData=UIImageJPEGRepresentation(croppedImage,1);
NSLog(@"Original size:%d",[imgData length]);
NSData *smallerImage=UIImageJPEGRepresentation(croppedImage, 0.5);
NSLog(@"End size:%d",[smallerImage length]);
imageData = imgData;
NSString *imageName = @"tempImage.jpg";
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectoryPath = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectoryPath stringByAppendingPathComponent:imageName];
NSData* settingsData = UIImageJPEGRepresentation(croppedImage, 0.5);
[settingsData writeToFile:dataPath atomically:YES];
[picker dismissModalViewControllerAnimated:YES];
}
Upload image:
-(void)uploadImageForOfferID:(NSString *)offerID imageExtention:(NSString *)extension withCompletionBlock:(void(^)(NSError *error))block
{
NSString *imageName = @"tempImage.jpg";
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectoryPath = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectoryPath stringByAppendingPathComponent:imageName];
NSData* imageData = [NSData dataWithContentsOfFile:dataPath];
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:masterURL]];
NSString *url = [NSString stringWithFormat:@"UploadImage?id=%@&ext=%@", offerID, extension];
NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:imageData name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Complete");
block(nil);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failed");
NSLog(@"FAILED WITH STATUS CODE %d - error description: %@", operation.response.statusCode, error.description);
block(error);
}];
[operation start];
}
This method saves the image to a file first then uploads it. I also tried just uploading the data from NSData *smallerImage=UIImageJPEGRepresentation(croppedImage, 0.5);
but with the same results.
Am I missing something here with the upload?
Thanks
EDIT ----
Comparing the file from simulator and the uploaded file. The simulator file is 2,538 bytes (4 KB on disk)
and the uploaded file is slightly larger at 2,698 bytes (4 KB on disk)
The original simulator image shows a thumbnail, but the uploaded image doesn't!
The uploaded image can be opened with Photoshop, but not with Safari or Chrome.
回答1:
Could it have something to do with you sending the image with type image/jpeg
when the file you are pointing to in the provided code is actually a .png
file and should be using image/png
?
来源:https://stackoverflow.com/questions/14015167/uploading-image-to-web-service-leaves-the-image-corrupt