2017-01-30 16 views
1

Я создаю страницу OneNote с помощью OneDrive iOS SDK из приложения iOS. Это код, который я сделал для почтового запроса для нескольких изображений.Как загрузить несколько изображений на одной странице OneNote?

NSMutableArray *selecedFileNames = [[NSMutableArray alloc] init]; 
NSString *date = [self formatDate]; 
NSString *start = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n" 
        "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en-us\">\r\n" 
        "<head>\r\n" 
        "<title>Created By</title>\r\n" 
        "<meta name=\"created\" content=\"%@\" />\r\n" 
        "</head>\r\n" 
        "<body>\r\n" 
        "<p>This is <b>Photo</b> <i>Created</i> note.</p>\r\n",date]; 

for (int i = 0; i<self.selectedImages.count; i++) { 

    self.imgObject = (ImageObjects *)[self.selectedImages objectAtIndex:i]; 

    FileModel *fileModel = [FileModel new]; 
    fileModel.fileData = self.imgObject.image_data; 
    fileModel.fileName = self.imgObject.imageName; 
    fileModel.fileType = FileTypeImage; 

    self.filePath = fileModel.getFileName; 

    NSString *trimmedString = [self.filePath stringByReplacingOccurrencesOfString:@" " withString:[NSString stringWithFormat:@"%d",i]]; 
    self.filePath = [trimmedString stringByReplacingOccurrencesOfString:@":" withString:@""]; 

    NSString *middle = [NSString stringWithFormat:@"<img src=\"%@\" alt=\"image\" width=\"500\">\r\n",self.filePath]; 

    [selecedFileNames addObject:self.filePath]; 
    start = [start stringByAppendingString:middle]; 

} 

start = [start stringByAppendingString:@"</body>\r\n" 
     "</html>\r\n"]; 

NSString *boundary = [self generateBoundaryString]; 

NSString *pagesEndpoint = [NSString stringWithFormat:@"sections/%@/pages", selectedSectionId]; 
NSString *fullEndpoint = [serviceRootUrl stringByAppendingString:pagesEndpoint]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; 
[request setURL:[NSURL URLWithString:fullEndpoint]]; 
[request setHTTPMethod:@"POST"]; 

// set content type 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 


[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Presentation\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type:application/xhtml+xml\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"%@\r\n", start] dataUsingEncoding:NSUTF8StringEncoding]]; 

for (int i=0; i< self.selectedImages.count; i++) { 

    self.imgObject = (ImageObjects *)[self.selectedImages objectAtIndex:i]; 

    FileModel *fileModel = [FileModel new]; 
    fileModel.fileData = self.imgObject.image_data; 
    fileModel.fileName = self.imgObject.imageName; 
    fileModel.fileType = FileTypeImage; 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\" \r\n",[selecedFileNames objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n--" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:fileModel.fileData]]; 
    [body appendData:[@"--\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

} 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n.", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 


NSString *finalBody =[[NSString alloc] initWithData:body encoding:NSASCIIStringEncoding]; 

// set request body 
[request setHTTPBody:body]; 

if (self.client) 
{ 
    // Send the HTTP request. 
    [self sendRequest:request]; 
} 

Я успешно смогу создать страницу с изображениями в OneNote, но я не могу видеть изображения на странице. Пожалуйста помоги мне с этим. Не удалось выяснить, в чем проблема в запросе. Есть ли проблема в запросе, который я создаю?

+0

Это только пример кода, предоставленного моей Microsoft. Можете ли вы поделиться своим конкретным кодом? Откуда берутся изображения? Вы отправляете изображение в запросах в виде multipart или ссылаетесь на URL-адрес изображения в HTML, например ? –

ответ

1

Если вы получаете код ответа «413», это означает, что вы превышаете размер запроса, отправляемого в API. Это зависит от общего размера отправляемых изображений, а не от количества изображений.

Обратите внимание, что отправка изображений через строку Base64 приводит к увеличению его размера на 33% (это то, что делает образец). Вы можете избежать этого 33% -ного удара, отправив многостраничный запрос. Кроме того, вы можете значительно уменьшить размер изображения, используя формат файла, например JPEG (похоже, вы используете PNG, поэтому вам, возможно, придется предпринять дополнительные шаги для уменьшения размера изображения).

Наш IOS образец делает именно это в функции createPageWithImage

NSString *attachmentPartName = @"pngattachment1"; 
NSString *date = dateInISO8601Format(); 
UIImage *logo = [UIImage imageNamed:@"Logo"]; 

NSString *simpleHtml = [NSString stringWithFormat: 
         @"<html>" 
         "<head>" 
         "<title>A simple page with an image from iOS</title>" 
         "<meta name=\"created\" content=\"%@\" />" 
         "</head>" 
         "<body>" 
         "<h1>This is a page with an image on it</h1>" 
         "<img src=\"name:%@\" alt=\"A beautiful logo\" width=\"%.0f\" height=\"%.0f\" />" 
         "</body>" 
         "</html>", date, attachmentPartName, [logo size].width, [logo size].height]; 

NSData *presentation = [simpleHtml dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *image1 = UIImageJPEGRepresentation(logo, 1.0); 
NSString *endpointToRequest = [ONSCPSCreateExamples getPagesEndpointUrlWithSectionName:sectionName]; 
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:endpointToRequest parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
    [formData 
    appendPartWithHeaders:@{ 
          @"Content-Disposition" : @"form-data; name=\"Presentation\"", 
          @"Content-Type" : @"text/html"} 
    body:presentation]; 
    [formData 
    appendPartWithHeaders:@{ 
          @"Content-Disposition" : [NSString stringWithFormat:@"form-data; name=\"%@\"", attachmentPartName], 
          @"Content-Type" : @"image/jpeg"} 
    body:image1]; 
}]; 

Если у вас есть эти заголовки:

Content-Type: multipart/form-data; boundary=0FA204EB-20EA-4E56-99EC-5EF56D600E02 

И это тело, он должен работать.

--0FA204EB-20EA-4E56-99EC-5EF56D600E02 
Content-Disposition: form-data; name="Presentation" 
Content-Type: text/html 
<!DOCTYPE html> 
<html><head><title>Created By Photo</title> 
<meta name="created" content="2017-02-01T11:34:11+05:30" /></head><body><p>This is some <b>Photo</b> <i>Created</i> note.</p></body><h1>This is a note with image.</h1> 
<img src="name:2017-02-01060411+0000.JPG" alt="image" ></body></html> 
--0FA204EB-20EA-4E56-99EC-5EF56D600E02 
Content-Disposition: form-data; name="2017-02-01060411+0000.JPG" 
Content-Type: image/jpeg 
IMAGE 
--0FA204EB-20EA-4E56-99EC-5EF56D600E02-- 
. 
+0

, пожалуйста, посмотрите, я обновил свой вопрос. И изображения, которые я сохранил в моем каталоге документов, и я преобразовываю его в данные. –

+0

Получил это. Обновлен мой ответ. –

+0

, где я могу получить этот AFHTTPRequestSerializer. Я только что установил OneDrive sdk, как было предложено на сайте. Live SDK был заменен OneDrive API. –

0

Это для одного или нескольких изображений.

NSMutableArray *selecedFileNames = [[NSMutableArray alloc] init]; 
NSString *date = [self formatDate]; 

NSString *pagesEndpoint = [NSString stringWithFormat:@"sections/%@/pages", selectedSectionId]; 
NSString *fullEndpoint = [serviceRootUrl stringByAppendingString:pagesEndpoint]; 

NSString *start = [NSString stringWithFormat:@"<html>" 
        "<head>" 
        "<title>Created By Photo</title>" 
        "<meta name=\"created\" content=\"%@\" />" 
        "</head>" 
        "<body>" 
        "<h1>This is a page with an image on it</h1>",date]; 

for (int i = 0; i<self.selectedImages.count; i++) { 

FileModel *fileModel = [FileModel new]; 
fileModel.fileData = self.imgObject.image_data; 
fileModel.fileName = self.imgObject.imageName; 
fileModel.fileType = FileTypeImage; 

self.filePath = fileModel.getFileName; 
UIImage *img = [UIImage imageWithData:fileModel.fileData]; 
NSString *trimmedString = [self.filePath stringByReplacingOccurrencesOfString:@" " withString:[NSString stringWithFormat:@"%d",i]]; 
self.filePath = [trimmedString stringByReplacingOccurrencesOfString:@":" withString:@""]; 

NSString *middle = [NSString stringWithFormat:@"<h1>This is image</h1>" 
        "<img src=\"name:%@\" alt=\"A beautiful image\" width=\"%.0f\" height=\"%.0f\" />\r\n",self.filePath,[img size].width, [img size].height]; 

[selecedFileNames addObject:self.filePath]; 
start = [start stringByAppendingString:middle]; 

} 

start = [start stringByAppendingString:@"</body>\r\n" 
"</html>\r\n"]; 


NSData *presentation = [start dataUsingEncoding:NSUTF8StringEncoding]; 

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:fullEndpoint parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 


    [formData appendPartWithHeaders:@{ 
           @"Content-Disposition" : @"form-data;    name=\"Presentation\"", 
           @"Content-Type" : @"text/html"} 
     body:presentation]; 


for (int i=0; i< self.selectedImages.count; i++) { 

self.imgObject = (ImageObjects *)[self.selectedImages objectAtIndex:i]; 

FileModel *fileModel = [FileModel new]; 
fileModel.fileData = self.imgObject.image_data; 
fileModel.fileName = self.imgObject.imageName; 
fileModel.fileType = FileTypeImage; 


    [formData 
     appendPartWithHeaders:@{ 
           @"Content-Disposition" : [NSString stringWithFormat:@"form-data; name=\"%@\"", [selecedFileNames objectAtIndex:i]], 
           @"Content-Type" : @"image/jpeg"} 
     body:fileModel.fileData]; 

} 

} error:nil]; 

if (self.client) 
{ 
// Send the HTTP request. 
[self sendRequest:request]; 
}