Изображение POST при проблеме с веб-сервером - PullRequest
0 голосов
/ 11 июля 2010

Я пытаюсь опубликовать изображение jpg на веб-сервере.Я проверил свой PHP-скрипт на сервере, и я могу загрузить изображение с помощью формы.Теперь я пытаюсь создать приложение Blackberry для отправки изображения на сервер, используя тот же сценарий, однако, когда я тестирую код Java, PHP сообщает мне, что НИЧЕГО НЕ ПОСТАВЛЕНО, я не уверен, что делаю неправильно, ноделаю что-то вроде этого:

String mBoundary = "SUPSUPSUPSUP";

/* Preparar objeto a enviar */

InputStream mImagen = this.getClass().getResourceAsStream("sample.jpg");            
byte[] mBytesPostear = IOUtilities.streamToBytes(mImagen);

HttpConnection mConexion = (HttpConnection) Connector.open("http://www.raspberry.com/script.php");                      

/* Preparar headers del POST. Es multiformulario con POST de un archivo */
mConexion.setRequestMethod(HttpConnection.POST);
mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, HttpProtocolConstants.CONTENT_TYPE_MULTIPART_FORM_DATA + ";boundary=" + mBoundary);
mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(mBytesPostear.length));
mConexion.setRequestProperty( "x-rim-transcode-content", "none" );                      

/* Preparar contenido de salida */
ByteArrayOutputStream mOutput = new ByteArrayOutputStream();            
OutputStream mOS = mConexion.openOutputStream();

/* Escribir contenido */
String nuevaLinea = "\r\n";
String contDisp="Content-Disposition:form-data; name=\"foto\";filename=\"sample.jpg\"";
String contEnc = "Content-Transfer-Encoding: binary";
String type="Content-Type:image/jpeg";

mOutput.write(nuevaLinea.getBytes());
mOutput.write("--".getBytes());
mOutput.write(mBoundary.getBytes());
mOutput.write(nuevaLinea.getBytes());
mOutput.write(contDisp.getBytes());
mOutput.write(nuevaLinea.getBytes());
mOutput.write(type.getBytes());
mOutput.write(nuevaLinea.getBytes());
mOutput.write(contEnc.getBytes());
mOutput.write(nuevaLinea.getBytes());
mOutput.write(nuevaLinea.getBytes());
mOutput.write(mBytesPostear);
mOutput.write(nuevaLinea.getBytes());
mOutput.write("--".getBytes());
mOutput.write(mBoundary.getBytes());
mOutput.write("--".getBytes());         
mOutput.write(nuevaLinea.getBytes());

/**********************/

/* Escribir el contenido */
mOS.write(mOutput.toByteArray());

mOutput.flush();
mOutput.close();

mOS.flush();
mOS.close();

/* Recibir respuesta del servidor */
InputStream mIS = mConexion.openInputStream();
int mLongitud = (int) mConexion.getLength();

if (mLongitud > 0) {                

    int mActual = 0;
    int mBytesLeidos = 0;
    byte[] mBytes = new byte[mLongitud];

    while ((mBytesLeidos != mLongitud) && (mActual != -1)){
        mActual = mIS.read(mBytes, mBytesLeidos, mLongitud - mBytesLeidos);
        mBytesLeidos += mActual;
    }               

    String mRespuesta = new String(mBytes);     
    System.out.println("Respuesta: " + mRespuesta);

} 

Я только что попытался клонировать заголовок, отправленный Chrome, когда я использую форму, я думаю, что они имеют ту же информацию.сценарий сначала проверяет, было ли что-то опубликовано, если ничего не было опубликовано, затем возвращает сообщение, поэтому я могу «использовать» сценарий на веб-сервере, и я вижу, что устройство Blackberry загружает данные, но ответ таков:ничего не было опубликовано.

Я думаю, что отправляю информацию на сервер в неправильном формате.

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Я добавил в код полную длину и проверил свой PHP-скрипт, и теперь он работает нормально: это полный фрагмент на тот случай, если кому-то еще это понадобится:

public class PostImagen {
private String mURL;
private byte[] mDatos;

public PostImagen(String URLServicio, byte[] Datos){
    mDatos = Datos;
    mURL = URLServicio;
}

public void getRespuesta() throws Exception {       
    try {                                      
        String mBoundary = "SUPSUP";            

        /* Strings a usar para el contenido */
        String nuevaLinea = "\r\n";
        String contDisp="Content-Disposition: multipart/form-data; name=\"foto\";filename=\"sample.jpg\"";
        String contEnc = "Content-Transfer-Encoding: binary";
        String type="Content-Type:image/jpeg";

        /* Preparar objeto a enviar */
        byte[] mBytesPostear;
        if (mDatos == null){
            InputStream mImagen = this.getClass().getResourceAsStream("sample.jpg");            
            mBytesPostear = IOUtilities.streamToBytes(mImagen);
        } else {
            mBytesPostear = mDatos;
        }                       

        System.err.println("Longitud de imagen: " + mBytesPostear.length);



        /* Preparar contenido de salida */
        ByteArrayOutputStream mOutput = new ByteArrayOutputStream();
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write("--".getBytes());
        mOutput.write(mBoundary.getBytes());
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write(contDisp.getBytes());
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write(type.getBytes());
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write(contEnc.getBytes());
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write(mBytesPostear);
        mOutput.write(nuevaLinea.getBytes());
        mOutput.write("--".getBytes());
        mOutput.write(mBoundary.getBytes());
        mOutput.write("--".getBytes());         
        mOutput.write(nuevaLinea.getBytes());

        /* Preparar conexión y headers */
        HttpConnection mConexion = (HttpConnection) Connector.open(mURL);
        mConexion.setRequestMethod(HttpConnection.POST);
        mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, HttpProtocolConstants.CONTENT_TYPE_MULTIPART_FORM_DATA + ";boundary=" + mBoundary);
        mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(mOutput.size()));          
        mConexion.setRequestProperty( "x-rim-transcode-content", "none" );      

        /**********************/
        System.err.println("Escribiendo stream");

        OutputStream mOS = mConexion.openOutputStream();            

        /* Escribir el contenido */
        mOS.write(mOutput.toByteArray());

        mOutput.flush();
        mOutput.close();

        mOS.flush();
        mOS.close();

        System.err.println("Se terminó de escribir payload, recibiendo respuesta");

        /* Recibir respuesta del servidor */
        if (mConexion.getResponseCode() != HttpConnection.HTTP_OK){             
            throw new Exception("El servidor NO regresó OK (200) al leer la respuesta. Saliendo...");
        }

        InputStream mIS = mConexion.openInputStream();
        int mLongitud = (int) mConexion.getLength();

        if (mLongitud > 0) {                

            int mActual = 0;
            int mBytesLeidos = 0;
            byte[] mBytes = new byte[mLongitud];

            while ((mBytesLeidos != mLongitud) && (mActual != -1)){
                mActual = mIS.read(mBytes, mBytesLeidos, mLongitud - mBytesLeidos);
                mBytesLeidos += mActual;
            }               

            String mRespuesta = new String(mBytes);     
            System.out.println("Respuesta: " + mRespuesta);

        } else {                                            
            throw new Exception("No se recibió respuesta del servidor");
        }                                           
    } catch (IOException e) {                                   
        throw new Exception("Error de lectura o escritura: " + e.getMessage());
    }       
}

}

1 голос
/ 11 июля 2010

Я не уверен, есть ли другие проблемы, но это выглядит не так:

mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(mBytesPostear.length));

Заголовок Content-Length должен давать длину в байтах полного тела запроса,включая все --boundary\r\nHeaders: stuff, а не только одно поле загруженного файла.

...