Форум программистов, компьютерный форум, киберфорум
Java: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 2

Multipart/form-data vk api

08.12.2015, 21:16. Показов 7856. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
vk api загрузка файлов на сервер (загрузка фото на стену) - ошибка Security Breach2
помогите разобраться...

Загрузка фотографий на стену пользователя
Загрузка фотографий на стену пользователя осуществляется в 3 этапа:

1. С помощью метода photos.getWallUploadServer приложение узнает http-адрес для загрузки фотографии на стену текущего пользователя, другого пользователя или группы в зависимости от переданных параметров user_id или group_id.

2. Приложение формирует POST-запрос на полученный адрес.
Запрос должен включать поле photo, содержащее файл с изображением (JPG, PNG, BMP или GIF)

Пример результата загрузки фотографии:

Code
1
{"server": "1234", "photo": "1234", "hash": "12345abcde"}

Обратите внимание, что ответ сервера всегда приходит в формате JSON, а поля server, photo и hash в нем содержат строки, внутренний формат которых может изменяться со временем. В частности, строка photo может содержать другой json-объект, который не следует декодировать, разбирать на части или иным образом модифицировать.

3. С помощью метода photos.saveWallPhoto приложение передает серверу полученные данные (server, photo, hash и опциональные user_id и group_id) и получает данные о загруженной фотографии. Обратите внимание, за один вызов photos.saveWallPhoto не может быть загружено более 6 фотографий.
1. С помощью метода photos.getWallUploadServer приложение узнает http-адрес для загрузки фотографии на стену текущего пользователя
1.0 запрос сделал, ответ получил:
Code
1
{"response":{"upload_url":"http:\/\/cs628828.vk.com\/upload.php?act=do_add&mid=12345&aid=-14&gid=67890&hash=9542a43b9073130c206eb5778d14e9c0&rhash=26372e5a1bb0aa99302f5d804aa5324d&swfupload=1&api=1&wallphoto=1","aid":-14,"mid":12345}}
1.1 отпарсил, получил: адрес сервера, user_id, album_id, hash итд... -всё, что мне вернул сервер;
1.2 сформировал урл:
Java
1
2
3
4
5
6
7
8
String url_to_send = upload_url+
                            "&mid=" +mid+
                            "&aid=" +aid+
                            "&hash="+hash+
                            "&rhash="+rhash+
                            "&swfupload=1"+
                            "&api=1"+
                            "&wallphoto=1";
2. Приложение формирует POST-запрос на полученный адрес.
Запрос должен включать поле photo, содержащее файл с изображением (JPG, PNG, BMP или GIF)
Так как с multipart data никогда дела не имел, позаимствовал из гугла пример рабочего кода для http post с multipart data:
2.0 создал класс:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
 
public class MultipartUtility {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;
 
    /**
     * This constructor initializes a new HTTP POST request with content type
     * is set to multipart/form-data
     * @param requestURL
     * @param charset
     * @throws IOException
     */
    public MultipartUtility(String requestURL, String charset)
            throws IOException {
        this.charset = charset;
 
        // creates a unique boundary based on time stamp
        boundary = "===" + System.currentTimeMillis() + "===";
 
        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
        httpConn.setRequestProperty("Test", "Bonjour");
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }
 
    /**
     * Adds a form field to the request
     * @param name field name
     * @param value field value
     */
    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name="" + name + """)
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }
 
    /**
     * Adds a upload file section to the request
     * @param fieldName name attribute in <input type="file" name="..." />
     * @param uploadFile a File to be uploaded
     * @throws IOException
     */
    public void addFilePart(String fieldName, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name="" + fieldName
                        + ""; filename="" + fileName + """)
                .append(LINE_FEED);
        writer.append(
                "Content-Type: "
                        + URLConnection.guessContentTypeFromName(fileName))
                .append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();
 
        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();
 
        writer.append(LINE_FEED);
        writer.flush();
    }
 
    /**
     * Adds a header field to the request.
     * @param name - name of the header field
     * @param value - value of the header field
     */
    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }
 
    /**
     * Completes the request and receives response from the server.
     * @return a list of Strings as response in case the server returned
     * status OK, otherwise an exception is thrown.
     * @throws IOException
     */
    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();
 
        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();
 
        // checks server's status code first
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }
 
        return response;
    }
}
2.1 попытался загрузить файл на сервер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String charset = "UTF-8";
        File uploadFile1 = new File("C:\\test.png");
        String requestURL = url_to_send +"&access_token="+TOKEN;        // пробовал и с токеном и без него - результат один...
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);
 
            //multipart.addHeaderField("User-Agent", "CodeJava");
            //multipart.addHeaderField("Test-Header", "Header-Value");
 
            //multipart.addFormField("description", "Cool Pictures");
            //multipart.addFormField("keywords", "Java,upload,Spring");
 
            multipart.addFilePart("photo", uploadFile1);
            //multipart.addFilePart("fileUpload", uploadFile2);
 
            List<String> response = multipart.finish();
 
            System.out.println("SERVER REPLIED:");
 
            for (String line : response) { System.out.println(line); }
        } catch (IOException ex) { System.err.println(ex); }
В ответ приходит: Security Breach2 - что то про нарушение безопасности.
Погуглил ошибку - пишут что передаю что-то лишнее / передаю не всё / неправильная boundary
Сколько не всматриваюсь в код - не пойму что где упустил.
Помогите разобраться...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2015, 21:16
Ответы с готовыми решениями:

Content type 'multipart/form-data;boundary=----WebKitFormBoundary.' not supported Spring Rest API
-1 голос «против» избранное Отправляю такой запрос: $.ajax({ type: 'POST', cache: false, processData: false, ...

Curl --header 'Content-Type: multipart/form-data' -X POST --form filename=@lib.dll
Здравствуйте коллеги! Хорошего дня! Windows 10 CMD curl --header 'Content-Type: multipart/form-data' -X POST --form...

multipart form data
Если готовая библиотека которая облегчает создание multipart/form data ??

1
0 / 0 / 0
Регистрация: 08.12.2015
Сообщений: 2
25.12.2015, 03:10  [ТС]
помогите дилетанту решить за него его проблему. обещаю разобраться в ней сразу после того, как найдется решение. но не наоборот..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2015, 03:10
Помогаю со студенческими работами здесь

XmlHttpRequest. multipart/form-data
Доброго дня всем. Отправка файла на сервер с помощью XmlHttpRequest вызвала у меня недоумение. По идее, чтобы серверный код мог...

Создать post с multipart/form-data
объясните пожалуйста, как правильно создать post запрос с multipart/form-data на защищенный сайт https:// чтоб отправлялось примерно...

Авторизация multipart/form-data; boundary
Здравствуйте, нужно написать авторизацию для одного сайта, но есть проблема, не знаю как работать с таким типом, вот так выглядит пост...

Multipart/form-data; boundary=----WebKitFormBoundaryJC2lNBJS8w8zo28W
По выше написанному понятно, что надо научить delphi (Synapce) отправлять такой POST запрос: Сводка сниффера: POST...

О этот непонятный multipart/form-data
Не нашел ни одной темы где бы разъяснили как с ним бороться=) Вот например у меня при загрузке картинки к товару в интернет магазине...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru