Загруженный файл имеет размер 0 байт, что с ним не так? - PullRequest
1 голос
/ 27 февраля 2012

Нужна помощь в выяснении, почему размер загружаемого файла составляет 0 байт?При нажатии на кнопку загрузки на странице появляется диалоговое окно сохранения или открытия, когда я выбираю сохранить в каком-то месте, сохраняет файл, но это пустой файл.Что с ним не так?

JSP-файл

<form target="_blank" method="get" action="/csm/download.action" >
    <input type="hidden" id="absFileName" name="absFileName" value="">
    <input type="submit" class="btn" id="btnDownloadConfig" value="Download Configuration"/>
</form>

Struts.xml

<action name="download" class="com.abc.csm.actions.DownloadConfiguration">
    </action>

Мой код для скачивания

String filePath = ServletActionContext.getServletContext().getRealPath("/")
filePath+=executionResponse

def splits=filePath.split("/")

cfgfileFileName=splits[splits.length-1]

println filePath+", "+cfgfile+", "+cfgfileFileName+", "+executionResponse

File f=new File(filePath)

println("Does file Exists? "+f.exists())

InputStream  inputStream = new FileInputStream(f)

response.setContentType("APPLICATION/xml")

response.addHeader("Content-Disposition", "attachment; filename=\""+cfgfileFileName+"\"")

Мой вывод вconsole

E:\Tomcat 6\webapps\csm\files//1123/Infa9_1_csmclientbeetle.xml, Infa9_1_csmclientbeetle.xml, files//1123/Infa9_1_csmclientbeetle.xml
Does file Exists? true

Расположение моего файла в веб-приложениях tomcat

E:\Tomcat 6\webapps\csm\files\1123

Обновление

Я нашел похожий вопрос это помогло мне

Это то, что я сделал с InputStream

FileInputStream ins = new FileInputStream(f)
    OutputStream out = response.getOutputStream()
    byte[] buf = new byte[1024]
    int len = 0
    while ((len = ins.read(buf)) >= 0)
    {
        out.write(buf, 0, len)
    }
    ins.close()
    out.close()

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012
InputStream  inputStream = new FileInputStream(f)
response.setContentType("APPLICATION/xml")
response.addHeader(
  "Content-Disposition", "attachment; filename=\""+cfgfileFileName+"\"")

это все? Куда вы отправляете файл? Вы можете пропустить что-то вроде

IOUtils.copy(inputStream, response.getOutputStream())
4 голосов
/ 27 февраля 2012

Я полагаю, что вы можете использовать S2 build в Stream result типе для более гибкой обработки ваших функций загрузки. Все вам нужно определить fileInputStream в вашем классе действий, который будет использоваться для загрузки вашего контента.

вы можете динамически устанавливать все остальные параметры в файле конфигурации. Вот пример кода

public class DownloadAction extends ActionSupport{

    private InputStream fileInputStream;

    public InputStream getFileInputStream() {
        return fileInputStream;
    }

    public String execute() throws Exception {
        fileInputStream = new FileInputStream(new File("location of your file"));
        return SUCCESS;
    }
}

вы можете использовать результат потока в вашем файле struts.xml

<action name="download" class="com.abc.csm.actions.DownloadConfiguration">
    <result name="success" type="stream">
      <param name="contentType">application/octet-stream</param>
      <param name="inputName">fileInputStream</param>
      <param name="contentDisposition">attachment;filename="fileABC.txt"</param>
      <param name="bufferSize">1024</param>
    </result>
   </action>

Все вышеперечисленные параметры внутри вашего тега действия могут быть установлены динамически. все, что вам нужно, чтобы определить свойства в вашем классе действий и использовать их в конфигурации.

например, если вы хотите установить тип содержимого динамически, создайте свойство в вашем классе действий с его методами получения и установки и установите значения этого свойства внутри вашего метода execute / любого другого метода. вам нужно использовать значение динамического свойства в вашем файле struts.xml, например

 <action name="download" class="com.abc.csm.actions.DownloadConfiguration">
        <result name="success" type="stream">
          <param name="contentType">${contentType}</param>
          <param name="inputName">fileInputStream</param>
          <param name="contentDisposition">attachment;filename="fileABC.txt"</param>
          <param name="bufferSize">1024</param>
        </result>
       </action>

для получения подробной информации о различных свойствах, которые можно установить в результатах вашего потока, см. Официальный документ

поток-результат

0 голосов
/ 27 февраля 2012

Попробуйте добавить это к вашему экземпляру писателя:

myWriter.flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...