Выполнение Http-запроса на передачу файла

  • Автор темы shershun4ik
  • Дата начала
S

shershun4ik

Гость
#1
Задача такая: "надо передать файл на web-сервер". Метод http-запроса должен быть "POST".
Вопросы:
1. Как выполнить http-запрос из агента на Lotus Script?
2. Как вставить бинарный файл в http-запрос?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#2
S

shershun4ik

Гость
#3
Проблема в том, что я java не знаю. Совсем не знаю. Есть ли возможность подключить к Lotus методы .NET?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#4
Есть ли возможность подключить к Lotus методы .NET?
не страдайте ... ерундой
java - стандарт для домины и никаких виндо-перудляторов :)
нечего там учить (в данном случае), особливо ежели шарпей знаете (МС его бессовестно драло с джава)
не ищите себе колья в пятую точку, а пользуйтесь тем - что даёт платформа
код, по ссылкам, запустите (для начала в любой java IDE: Eclipse, NetBeans)
апачевскую либу надо будет распаковать и подсунуть в jvm/lib/ext, для запуска кода в домине
по ссылке всякие туториалы и примеры
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#6
а это-то, здесь, причём?
java учить и выкинуть из головы шарпей :) - если, конечно, доминой планируете заниматься

да и вобщем
java гораздо распространённей (на ней работает куча глобальных проектов) и имеет больше либ (почти на все случаи жизни), кот. отрабатывались годами..., в отличии от офтопика (.НЕТ ещё неустаканившаяся платформа, сильно зависимая от МС)
ну конечно - если без МС и башляния никак... :), но тогда вам и домина никчему ;)
 
S

shershun4ik

Гость
#7
Пытаюсь разобраться на основании примера

http://stackoverflow.com/questions/1067655...1068132#1068132

Вставляю код в NetBeans и java не видит класс org.apache.http.entity.FileEntity (говорит "неиспользуемый лператор импорта"). Что я делаю не так?

Класс org.apache.http.entity.FileEntity есть в библиотеке httpcore-4.1.jar (раскрываю org.apache.http.entity и там есть FileEntity.class), но java ругается.

Может быть такое, что она не находит используемые в org.apache.http.entity.FileEntity классы: java.io.File, java.io.IOException, java.io.InputStream, java.io_OutputStream? Java.io стандартно подключается ко всем проектам или я не прав?

Вот как я скопировал код:

Код:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sendfile;

/**
*
* @author User
*/
import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;

public class SendFile {


/**
* @param args the command line arguments
*/
public static void main(String[] args) {

HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

HttpPost httppost = new HttpPost("http://localhost:9001/upload.php");
File file = new File("c:/TRASH/zaba_1.jpg");

MultipartEntity mpEntity = new MultipartEntity();
ContentBody cbFile = new FileBody(file, "image/jpeg");
mpEntity.addPart("userfile", cbFile);


httppost.setEntity(mpEntity);
System.out.println("executing request " + httppost.getRequestLine());
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();

System.out.println(response.getStatusLine());
if (resEntity != null) {
System.out.println(EntityUtils.toString(resEntity));
}
if (resEntity != null) {
resEntity.consumeContent();
}

httpclient.getConnectionManager().shutdown();
}

}
 

Zeka

Well-Known Member
01.09.2009
219
0
#8
Видимо библиотека httpcore-4.1.jar не добавлена в classpath.
Может быть такое, что она не находит используемые в org.apache.http.entity.FileEntity классы: java.io.File, java.io.IOException, java.io.InputStream, java.io_OutputStream? Java.io стандартно подключается ко всем проектам или я не прав?
Да, эти классы идут вместе c любой JRE. Спецально подключать не надо.

ПС: Выложи stacktrace
 
S

shershun4ik

Гость
#9
С предыдущим примером я разобрался. Там моя ошибка. Неверно скопировал код.

Есть еще вот такой вот пример:

Код:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class SendFile {

private static String url =
"http://localhost:7000/FileUpload.ashx?basic=1";

public static void main(String[] args) throws IOException {
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(url);

client.setConnectionTimeout(8000);

// Send any XML file as the body of the POST request
File f = new File("D:/MediaID.bin");
System.out.println("File Length = " + f.length());

postMethod.setRequestBody(new FileInputStream(f));
postMethod.setRequestHeader("Content-type",
"text/xml; charset=ISO-8859-1");

int statusCode1 = client.executeMethod(postMethod);

System.out.println("statusLine>>>" + postMethod.getStatusLine());
postMethod.releaseConnection();
}
}
Вопросы по нему:

1. Я не нашел в apache-евской библиотеке httpclient следующие классы:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;

Где их можно взять?

2. В примере указывается одна строка в залоловке запроса:
postMethod.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1");

А мне надо передать еще дополнительные значения в заголовке. Как это сделать?
 

Zeka

Well-Known Member
01.09.2009
219
0
#10
1. Я не нашел в apache-евской библиотеке httpclient следующие классы:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;

Где их можно взять?

2. В примере указывается одна строка в залоловке запроса:
postMethod.setRequestHeader("Content-type", "text/xml; charset=ISO-8859-1");

А мне надо передать еще дополнительные значения в заголовке. Как это сделать?
1. org.apache.commons вроде как устаревший пакет. Искать в старых JARах.

2. postMethod.setRequestHeader - сколько раз вызовешь метод с разными хёдерами, столько ВРОДЕ он их и добавит.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#11
1. Zeka вам ответил, смотрите другой код (для более новой библиотеки, соответственно и либы др. для импорта)
2. есть разные методы задачи параметров, для разных классов, шукайте здесь сморите экзампелы из архивов
просто для разных ситуаций могут быть свои "подходы"
 
S

shershun4ik

Гость
#12
Вот такой у меня получился код

Код:
package sendfile;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.Credentials;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class SendFile {

private static String url = "http://localhost:7000/FileUpload.ashx?basic=1";

public static void main(String[] args) throws IOException {
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(url);

client.setConnectionTimeout(8000);
Credentials defaultcreds = new UsernamePasswordCredentials("USER", "**********");
client.getState().setCredentials(AuthScope.ANY, defaultcreds);


// Send any file as the body of the POST request
File f = new File("D:/MediaID.bin");
System.out.println("File Length = " + f.length());
postMethod.setRequestBody(new FileInputStream(f));
postMethod.setRequestHeader("Content-type", "application/octet-stream");
postMethod.setRequestHeader("clientGuid", "06d8f57f-2c3e-4225-98f8-b1f02ff08a77");
postMethod.setRequestHeader("value", "128");
postMethod.setRequestHeader("FileName", "MediaID.bin");


int statusCode1 = client.executeMethod(postMethod);

System.out.println("statusLine>>>" + postMethod.getStatusLine());
postMethod.releaseConnection();
}
}
В ответ я получаю statusCode1 = 400 (BadRequest). Что я делаю не так?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#13
если вы хотите добавлять параметры, дык их и добавляйте, по типу:<!--shcode--><pre><code class='java'>postMethod.addParameter(new NameValuePair("paramName", paramValue));[/CODE]а вы их в хидер пихаете

Добавлено: и воще сморите юзаджи
 
S

shershun4ik

Гость
#14
У меня есть код на C#, который делает то, что мне надо. Там все это в Header пишется

Еще один вопрос: "Как просмотреть текст http-запроса"?

Код:
 request.ContentType = "application/octet-stream";
request.Method = "POST";
request.Headers["clientGuid"] = ClientId.ToString();
request.Headers["value"] =
operationId.Value.ToString();
request.Headers["FileName"] =
Convert.ToBase64String(Encoding.UTF8.GetBytes(filename));
Вот я и пишу по аналогии.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#15
Еще один вопрос: "Как просмотреть текст http-запроса"?
для клиентской части - для javascript есть, для серверной - на соответствующем сервере
вы, так понимаю, обращаетеськ внешнему серваку (не встроенным/интегрированным в NetBeans)...
ставьте снифер (любой), кот. http мониторит...
я wireshark люблю ;) (он мониторит "всё", можно задать нужные фильтры, я так отслеживал заголовки, уходящие на торенттреккер)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 490
366
#16
есть писанная на java и именно для http https
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться

ставите его проксём (в коде придётся делать соединение через прокси 127.0.0.1:8008)
и мониторите