Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Barbariss
0 / 0 / 0
Регистрация: 11.12.2015
Сообщений: 3
1

Требуется Upload файл на веб-сервер

11.12.2015, 10:49. Просмотров 893. Ответов 3
Метки нет (Все метки)

Я работаю с Memsource cloud API.
http://wiki.memsource.com/wiki/Memsource_API

Мне требуется выгрузить файл на веб-сервер.
Примеры допустимых форматов файла: .txt, .doc, .xls.

Для Upload предназначен Url (более подробно см. Method.png): http://cloud1.memsource.com/web/api/v7/job/uploadBilingualFile
, который принимает два обязательных параметра: token (тип string) и bilingualFile (бинарное представление файла, который нужно выгрузить).

Серфинг по интернету привел меня к попытке использовать HttpWebRequest.
ContentType устанавливаю как multipart/form-data, а Method как POST.

Выдается ошибка "400. Bad request".
Подскажите, пожалуйста, что я делаю не так?

C#
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
var uri = "http://cloud1.memsource.com/web/api/v7/job/uploadBilingualFile";
_request = (HttpWebRequest)WebRequest.Create(uri);
 
var boundary = "B0unD-Ary";
_request.ContentType = "multipart/form-data; boundary=" + boundary;
_request.Method = "POST";
_request.UserAgent = "UploadTester v0.1";
 
var postData = "--" + boundary + "\r\nContent-Disposition: form-data\r\n\r\n";
postData += string.Format("token={0}\r\n", _token);
postData += "--" + boundary + "\r\nContent-Disposition: form-data; name="bilingualFile"; filename="1.xls"\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n\r\n";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
 
byte[] filedata = null;
using (var reader = new BinaryReader(File.OpenRead(@"D:\1.xls")))
filedata = reader.ReadBytes((int)reader.BaseStream.Length);
 
_request.ContentLength = byteArray.Length + filedata.Length;
_request.GetRequestStream().Write(byteArray, 0, byteArray.Length);
_request.GetRequestStream().Write(filedata, 0, filedata.Length);
 
WebResponse response = _request.GetResponse();
Stream data = response.GetResponseStream();
StreamReader sReader = new StreamReader(data);
String sResponse = sReader.ReadToEnd();
response.Close();
0
Миниатюры
Требуется Upload файл на веб-сервер  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2015, 10:49
Ответы с готовыми решениями:

Upload файлов из WinForms апликации на Web сервер
Есть WinForms апликация, которая, между всем прочим, должна аплоадить файлы на Web сервер по HTTP...

Прогресс для Upload файла на сервер используя HttpClient
Подскажите пожалуйста, как можно сделать прогресс Upload файла на сервер с помощью HttpClient? В...

Upload to OneDrive: ошибка 404 при загрузке файла на сервер
День добрый. На сервере OneDrive (Microsoft) имеется некий файл. Этот файл открыт для общего...

Upload файлов на сервер
У меня вопрос: как загрузить файл на сервер, и при этом проверить его расширение?

Upload ASP.NET проекта на сервер
Всем привет! Я делаю свой первый проект на ASP.NET. Проект близится к завершению, но возникает...

3
Barbariss
0 / 0 / 0
Регистрация: 11.12.2015
Сообщений: 3
11.12.2015, 11:00  [ТС] 2
Ps: задайте _token как реально действующую константу.
var _token = "87039-6ed88150558f4c40c3259b7949b21cf4";
0
g-coder
66 / 32 / 2
Регистрация: 11.10.2011
Сообщений: 128
11.12.2015, 12:18 3
Вот пример из их API как загрузить файл. На Java правда, но сути не меняет.

POST запрос можно сформировать примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            using (var client = new HttpClient())
            {
                // HTTP POST
                var values = new Dictionary<string, string>
                {
                   { "task", <номер таски> },
                   { "format", <формат> },
                   { "saveToTransMemory", <?> },
                   { "setCompleted", <?> },
                   { "bilingualFile", System.Text.Encoding.UTF8.GetString(filedata); },
                };
 
                var content = new FormUrlEncodedContent(values);
                var response = await client.PostAsync(uri, content);
                var responseString = await response.Content.ReadAsStringAsync();
            }
Добавлено через 37 минут
Вот что в итоге получилось:

C#
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
        public async static void UploadFile()
        {
            var uri = "http://cloud1.memsource.com/web/api/v7/job/uploadBilingualFile";
            var _token = "87039-6ed88150558f4c40c3259b7949b21cf4";
 
            byte[] filedata;
            using (var reader = new BinaryReader(File.OpenRead(@"C:\inc\textfile.txt")))
            filedata = reader.ReadBytes((int)reader.BaseStream.Length);
 
            using (var client = new HttpClient())
            {
                var values = new Dictionary<string, string>
                {
                   { "token", _token },
                   { "format", "Mxlf" },
                   { "saveToTransMemory", "Confirmed" },
                   { "setCompleted", "false" },
                };
 
                var strContent = new FormUrlEncodedContent(values);
 
                MultipartFormDataContent multipartContent = new MultipartFormDataContent();
                multipartContent.Add(new ByteArrayContent(filedata));
                multipartContent.Add(strContent);
 
                var response = await client.PostAsync(uri, multipartContent);
                var responseString = await response.Content.ReadAsStringAsync();
            }
        }
Либо нет доступа, либо что то еще.
{StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
X-Frame-Options: DENY
Transfer-Encoding: chunked
Cache-Control: no-store, max-age=0, private
Date: Fri, 11 Dec 2015 09:16:50 GMT
Server: Apache-Coyote/1.1
Content-Type: application/json; charset=UTF-8
Expires: Fri, 11 Dec 2015 08:16:50 GMT
Last-Modified: Fri, 11 Dec 2015 09:16:50 GMT
}}
{"errorCode":"AuthUnauthorized","errorDescription":"Unauthorized access."}
0
Barbariss
0 / 0 / 0
Регистрация: 11.12.2015
Сообщений: 3
16.12.2015, 09:40  [ТС] 4
Задача решена следующим образом:

C#
1
2
3
4
5
public static bool UploadFile(string filePath)
        {
            var uri = string.Format("http://cloud1.memsource.com/web/api/v7/job/uploadBilingualFile?token={0}", _token);
            return PostFile(uri, filePath, "bilingualFile");
        }
C#
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
private static bool PostFile(string uri,string filePath, string contentDispositionParameterName)
        {
            byte[] filedata;
            using (var reader = new BinaryReader(File.OpenRead(filePath)))
                filedata = reader.ReadBytes((int)reader.BaseStream.Length);
 
            using (var client = new HttpClient())
            {
                var multipartContent = new MultipartFormDataContent();
 
                var fileContent = new ByteArrayContent(filedata);
                var fileName = Path.GetFileName(filePath);
                var contentType = MimeMapping.GetMimeMapping(fileName);
                fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    FileName = fileName,
                    Name = contentDispositionParameterName
                };
                multipartContent.Add(fileContent);
 
                var response = client.PostAsync(uri, multipartContent);
                response.Wait();
                return response.Result.IsSuccessStatusCode;
            }
        }
Значение _token валидно 24 часа (поэтому нужно следить, чтобы значение _token было актуальным/рабочим).
Для определения значения _token используется метод:

C#
1
2
3
4
5
6
7
8
9
10
11
12
public static bool Authentification(string userName, string password)
        {
            using (var client = new WebClient())
            {
                var address = string.Format("http://cloud1.memsource.com/web/api/v3/auth/login?userName={0}&password={1}", userName, password);
                var content = client.DownloadString(address);
                var js = new JavaScriptSerializer();
                var authResponse = (AuthResponse)js.Deserialize(content, typeof(AuthResponse));
                _token = authResponse.Token;
                return !string.IsNullOrWhiteSpace(_token);
            }
        }
0
16.12.2015, 09:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2015, 09:40

Upload на сервер файлов более 4 мегабайт
Подскажите пожалуйста... на сервер не загружаются файлы больше 4Mb. Что делать? Где настраивать?...

Как сделать upload на сервер свою страничку, что бы потом ее запустить?
Как сделать upload на сервер свою страничку, что бы потом ее запустить? Естественно без...

Как покрасивее сделать upload базы данных Accsess на сервер и подключить ее?
Уважаемые коллеги не подскажет ли кто как покрасивее сделать upload базы данных Accsess на сервер и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru