Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Работа с изображенями средствами Struts


Автор: Maksym 8.6.2006, 12:32
Загружаю изображение так:
Код

<html:form action="PhotoEdit" method="POST" enctype="multipart/form-data" >
  <html:file property="photo" />
  <html:submit>Upload Photo</html:submit>
</html:form>

Созданы соответствующий Action - PhotoEdit и ActionForm для него.
Как здесь же сразу показать загруженную картинку? Есть ли в Struts готовые решения?  smile  

Автор: tux 8.6.2006, 13:11
Нет специальных средств. Напиши action, который будет картинку в response выдавать. Выглядеть он будет примерно так:
Код

public class ShowPhotoAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        byte[] image = getImage();
        response.getOutputStream().write(image);
        return null;
    }
    
    private byte[] getImage() {
        // здесь берем откуда-то массив с изображением
    }

}

Потом кидаешь ссылку на этот action в JSP и фсё. Ну ессно, если картинка большая, то лучше из потока писать, а не из массива. 

Автор: Maksym 8.6.2006, 14:43
tux
Спасибо. Но мне же нужно не весь response картинкой занять. Картинка где-то внутри сложной страницы выводится... 

Автор: batigoal 8.6.2006, 15:02
Сделай ее отдельной страницей, и пропиши внутрь тега <img src="...">. 

Автор: Maksym 8.6.2006, 16:53
Lamer George
tux

Прописал
Код
<img src="./ShowPhoto.do" alt="Photo">
, при том, что в struts-config.xml:
Код
<action path="/ShowPhoto" type="crewing.actions.ShowPhotoAction"></action>
, где ShowPhotoAction - описанный tuxом выше Action. Все отлично работает. Спасибо, вопрос решен  smile smile 

ЗЫ.
Передаю в request'е номер изображения для ShowPhotoAction и он у меня вообще отличненько паказывает фотки в любом месте системы. Здорово  smile  

Автор: MisterCleric 21.6.2006, 10:16
Ребята, а покажите плз, как выглядит страничка с таким тегом    
<img src="./ShowPhoto.do" alt="Photo"> 
как выглядит к ней обращение, 
и как обращаться к  ShowPhotoAction ? 

Автор: Maksym 21.6.2006, 13:02
MisterCleric
не понял  smile 
Страничка выглядит обычно - страничка с картинкой..
ShowPhoto.do - и есть обращение к ShowPhotoAction - я же выше написал как он у меня замапен. 

Автор: MisterCleric 21.6.2006, 13:49
Дело в том, что я делаю сначала аплод картинкы, а потом пытаюсь его показать таким образом, как у тебя. Вот аплод проходит, а показывать не хочет.
И аплод и метод показа в одном экшене. Т.е. аплодю и показываю за один раз. Но вот нет не хочет 

Автор: tux 21.6.2006, 13:51
Цитата(MisterCleric @  21.6.2006,  18:49 Найти цитируемый пост)
И аплод и метод показа в одном экшене. Т.е. аплодю и показываю за один раз. Но вот нет не хочет  

А что именно не получается? Поконкретнее пожалуйста. 

Автор: MisterCleric 21.6.2006, 14:02
Вот код Экшина по аплоду и показу:
Код

import com.opensymphony.xwork.ActionSupport;

import javax.imageio.ImageIO;
import java.io.*;
import java.awt.image.BufferedImage;

public class FileUploadAction extends ActionSupport {
    private File doc;
    private String fileName;
    private String contentType;
    private int contentLength;
    private int bufferSize;
    private byte[] buffer = null;

    public String doDefault() {
         return "myImageResult";
     }
     public String getDocFileName() {
        return fileName;
    }
    public void setDocFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getDocContentType() {
        return contentType;
    }
    public void setDocContentType(String contentType) {
        this.contentType = contentType;
    }

    public int getDocContentLength() {
        return contentLength;
    }
    public void setDocContentLength(int contentLength) {
        this.contentLength = contentLength;
    }

    public void setDocBufferSize(int bufferSize) {
        this.bufferSize = bufferSize;
    }
   public int getDocBufferSize() {
       return bufferSize;
   }

    public File getDoc() {
        return doc;
    }
    public void setDoc(File doc) {
        this.doc = doc;
    }
   public byte[] getImageInBytes() {
       return buffer;
   }
   public String execute(){
       try {
          BufferedImage image = ImageIO.read(this.getClass().getResource(doc.getPath()));
          ByteArrayOutputStream bos = new ByteArrayOutputStream();
          ImageIO.write(image, "jpg", bos);
          buffer = bos.toByteArray();
          } catch (Exception e) {
              e.printStackTrace();
          }
       return SUCCESS;
    }
}

Вот код резалта:
Код

import com.opensymphony.xwork.*;
import com.opensymphony.webwork.ServletActionContext;
import javax.servlet.http.HttpServletResponse;

public class BytesResult implements Result {

    public void execute(ActionInvocation invocation) throws Exception {
        FileUploadAction action = (FileUploadAction) invocation.getAction();
        HttpServletResponse response = ServletActionContext.getResponse();

        response.setContentType(action.getDocContentType());
        response.setContentLength(action.getDocContentLength());

        response.getOutputStream().write(action.getImageInBytes());
        response.getOutputStream().flush();
    }
}

Вот XWork
Код

<xwork>
    <include file="webwork-default.xml" />

  <package name="fileupload" extends="webwork-default">
    <result-types>
        <result-type name="myBytesResult" class="mycom.wwuploadimg.BytesResult" />
    </result-types>
   
    <action name="doUpload" class="mycom.wwuploadimg.FileUploadAction">
        <interceptor-ref name="completeStack"/>
        <result name="myImageResult" type="myBytesResult">
            <param name="contentType">${docContentType}</param>
            <param name="contentLength">${docContentLength}</param>
            <param name="buffersize">${docBufferSize}</param>
        </result>
    </action>

    </package>
</xwork>

А вот странички загрузка и показ соответсвенно:
Код

    <ww:form action="doUpload" method="POST" enctype="multipart/form-data">
        <ww:file name="doc" label="File"/>
        <ww:submit />
    </ww:form>
-----------------------------------------------------
<img src="/upandimg/doUpload!default.action" />
 

Автор: Maksym 21.6.2006, 14:04
MisterCleric
Как ты храниш и извлекаеш изображение? покажи код работы с базой, какая СУБД, какой тип поля..? 

Автор: tux 21.6.2006, 14:06
MisterCleric, ты скажи в чем проблема-то. Здесь же не телепаты сидят. Симптомы опиши. 

Автор: Maksym 21.6.2006, 14:07
MisterCleric
О сори, пока писал про данные, ты добавил свой код.. И что происходит при аплоаде? 

ЗЫ. Неплохо бы все таки разделить загрузку и показ изображения на два разных action, а потому аккуратно протрассировать, проследить везде ли передается массив байт изображения. 

Автор: MisterCleric 21.6.2006, 14:37
ок. Понял спасибо  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)